当有数据时,Android Sqlite查询返回Empty set

时间:2017-11-03 04:09:51

标签: android sqlite android-sqlite sqliteopenhelper android-database

我的数据库适配器扩展了 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 ,我允许通过 方法 <在应用程序中删除数据/ strong>(此方法在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指示失败。

我非常确定结果为空,因为我通过 调试 Log.d()进行了检查。确定数据可在数据库中找到。

我在这里做错了什么?

1 个答案:

答案 0 :(得分:1)

我认为问题可能是您删除了行,然后将其反映在您随后查看的光标中,因此是空的,因为您只能在其中移动时实际获得光标(包括使用numpy.where()方法,因此可以使用getCount代替getCount)。

我建议您尝试在删除之前获取行信息,然后在从行中获取信息后删除。

不使用检查空游标,如果查询有效,则不会为空。

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

moveToFirst

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