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;
}
注意!我还没有对此进行测试,因此可能存在奇怪的拼写错误或错误。
我有一个 数据库适配器 扩展 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;
}
注意!我还没有对此进行测试,因此可能存在奇怪的拼写错误或错误。