我的数据库适配器扩展了 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()
进行了检查。确定数据可在数据库中找到。
我在这里做错了什么?
答案 0 :(得分:1)
我认为问题可能是您删除了行,然后将其反映在您随后查看的光标中,因此是空的,因为您只能在其中移动时实际获得光标(包括使用numpy.where()
方法,因此可以使用getCount
代替getCount
)。
我建议您尝试在删除之前获取行信息,然后在从行中获取信息后删除。
不使用检查空游标,如果查询有效,则不会为空。
所以也许你想要这样的东西: -
moveToFirst
注意!我没有对此进行测试,因此可能存在奇怪的拼写错误或错误。