Android 有数据时,Sqlite 查询返回空集

Android Sqlite query returning Empty set when there is Data

我有一个 数据库适配器 扩展 SQLiteOpenHelper.

public class DatabaseHelper extends SQLiteOpenHelper {
public SQLiteDatabase database;
public DatabaseHelper(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
    database = this.getWritableDatabase();
}
@Override
public void onCreate(SQLiteDatabase db) {
    // Creating Image table
    db.execSQL("CREATE TABLE "+IMAGE_TABLE+"("
            +IMAGE_ID+" INTEGER PRIMARY KEY AUTOINCREMENT,"
            +IMAGE_DATA+" BLOB NOT NULL);");
    db.execSQL("CREATE TABLE "+CREDIT_CATEGORY_TABLE+"("
            +CREDIT_CATEGORY_ID+" INTEGER PRIMARY KEY AUTOINCREMENT,"
            +CREDIT_CATEGORY_NAME+" VARCHAR(256) UNIQUE NOT NULL,"
            +CREDIT_CATEGORY_IMAGE+" INTEGER DEFAULT NULL REFERENCES "+IMAGE_TABLE+"("+IMAGE_ID+") ON DELETE RESTRICT ON UPDATE CASCADE);");
}
}

这是与这个问题相关的数据库结构。有了这样的结构,我正在 查询一行 以填充 RecyclerView 适配器,如下所示....

Cursor c = database.query(CREDIT_CATEGORY_TABLE,null,null,null,null,null,null,position+",1");

对于从此查询返回的 CREDIT_CATEGORY_ID,我允许通过方法(此方法在DatabaseAdapter中)。

public boolean deleteCreditCategory(int creditCategoryId) {
    if(isCreditCategoryDeletable(creditCategoryId)) {
        // TODO DEBUG this: The query function is always returning an Empty set
        Cursor c = database.query(CREDIT_CATEGORY_TABLE,new String[] {CREDIT_CATEGORY_IMAGE,CREDIT_CATEGORY_ID},CREDIT_CATEGORY_ID+"=?",new String[] {creditCategoryId+""},null,null,null);
        database.beginTransaction();
        if( database.delete(CREDIT_CATEGORY_TABLE,CREDIT_CATEGORY_ID+" = ?",new String[] {creditCategoryId+""}) == 1 )
        {
            // TODO BUG_INFO: since the query method returning empty set, we can't moveToFirst()...
            if(!c.moveToFirst()) {
                database.endTransaction();
                return false;
            }
            if(c.isNull(c.getColumnIndex(CREDIT_CATEGORY_IMAGE))) {
                database.setTransactionSuccessful();
                database.endTransaction();
                return true;
            }
            else {
                int imageId = c.getInt(c.getColumnIndex(CREDIT_CATEGORY_IMAGE));
                if( this.deleteImage(imageId) ) {
                    database.setTransactionSuccessful();
                    database.endTransaction();
                    return true;
                }
                else {
                    database.endTransaction();
                    return false;
                }
            }
        }
        else {
            database.endTransaction();
            return false;
        }
    }
    else
        return false;
}

由于此查询 c.query() 总是返回空集 ,方法 c.moveToFirst() 返回 false DeleteCreditCategory 方法返回 false,表示失败。

我很漂亮 确定结果是空的 因为我通过 Debug 检查过和 Log.d()。数据库中确实有可用数据。

我做错了什么?

我认为问题可能是您删除了该行,然后这反映在您随后查看的游标中,因此它是空的,因为相信游标只有在您在其中移动时才真正获得(这包括使用 getCount 方法,因此可以使用 getCount 而不是 moveToFirst).

建议你尽量在删除前获取行信息,获取行信息后再删除。

不检查 null 游标,如果查询有效则它不会为 null。

所以也许你想要这样的东西:-

public boolean deleteCreditCategory(int creditCategoryId) {
    if(isCreditCategoryDeletable(creditCategoryId)) {
        // TODO DEBUG this: The query function is always returning an Empty set
        Cursor c = database.query(CREDIT_CATEGORY_TABLE,new String[] {CREDIT_CATEGORY_IMAGE,CREDIT_CATEGORY_ID},CREDIT_CATEGORY_ID+"=?",new String[] {creditCategoryId+""},null,null,null);
        if (Cursor.moveTofirst) {
            int imageid = c.getInt(c.getColumnIndex(CREDIT_CATEGORY_IMAGE));
            database.beginTransaction();
            if (database.delete(CREDIT_CATEGORY_TABLE,CREDIT_CATEGORY_ID+" = ?",new String[] {creditCategoryId+""}) == 1) {
                if( this.deleteImage(imageId) ) {
                    database.setTransactionSuccessful();
                    database.endTransaction();
                    return true;
                }
            }
            database.endTransaction();
        }
    }
    return false;
}

注意!我还没有对此进行测试,因此可能存在奇怪的拼写错误或错误。