0

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?

+0

Welche 'creditCategoryId' übergeben Sie an diese Methode? Woher bekommst du es? – pskink

+0

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

+0

erhalten habe Was hat "position" mit der Datenbankzeilen-ID zu tun? – pskink

Antwort

1

Ich denke, das Problem kann sein, dass Sie die Zeile löschen und dies wird dann in den Cursor reflektiert, die Sie dann betrachten und daher leer ist, wie ein Cursor nur tatsächlich erhalten wird, wenn Sie innerhalb bewegen (was enthält mit der getCount Methode, so getCount könnte anstelle von moveToFirst verwendet werden).

Ich schlage vor, Sie versuchen, die Zeileninformationen vor dem Löschen und dann löschen, nachdem Sie die Informationen aus der Zeile erhalten.

Keine Verwendung für die Überprüfung auf Null-Cursor, es wird nicht null sein, wenn die Abfrage funktioniert.

Also vielleicht wollen Sie so etwas wie: -

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; 
} 

Hinweis! Ich habe das nicht getestet, daher könnte es einen Tippfehler geben.

+0

Ich werde Ihre Änderungen versuchen und Ihnen das Ergebnis antworten ...... – kingmaker

+0

Sie sind Right Buddy, der Cursor ruft das ResultSet nur dann in sich ab, wenn wir nach Daten von It wie 'getCount()', 'moveToFirst () ',' getInt() ', etc ...... – kingmaker