Ich habe eine Database Adapter die SQLiteOpenHelper erstreckt.Android SQLite Abfrage Empty set zurückkehrt, wenn es Daten
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);");
}
}
Dies ist die Datenbankstruktur, die auf diese Frage relevent ist. Und mit einer solchen Struktur, ich bin eine Reihe Abfrage der RecyclerView Adapter für bevölkern, wie unten gezeigt ....
Cursor c = database.query(CREDIT_CATEGORY_TABLE,null,null,null,null,null,null,position+",1");
Mit dem CREDIT_CATEGORY_ID von dieser Abfrage zurückgegeben, ich bin so dass die Daten gelöscht werden in der Anwendung durch eine Methode (diese Methode ist in 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;
}
Da diese Abfrage c.query()
ist immer eine leere Menge zurückkehrt, wobei das Verfahren c.moveToFirst()
ist falsch und die DeleteCreditCategory Methode false zurückkehrt Zurückgeben eines Fehler angibt.
Ich bin mir ziemlich sicher, dass der Ergebnisse ist leer wie ich das überprüft durch Debug und Log.d()
.Es ist sicher, dass Daten in der Datenbank.
Was habe ich hier falsch gemacht?
Welche 'creditCategoryId' übergeben Sie an diese Methode? Woher bekommst du es? – pskink
Ich übergebe den ID-Wert, den ich aus dem 'Cursor c = database.query (CREDIT_CATEGORY_TABLE, null, null, null, null, null, null, position +", 1 ");' zur Methode deleteCreditCategory() ' – kingmaker
erhalten habe Was hat "position" mit der Datenbankzeilen-ID zu tun? – pskink