wake-up-neo.net

So testen Sie, ob der Cursor in einer SQLiteDatabase-Abfrage leer ist

Ich habe eine SQL-Tabelle, die durch folgenden Code erstellt wird:

public void onCreate(SQLiteDatabase db) {
    db.execSQL("CREATE TABLE " + TABLE_NAME + " (" + _ID
        + " INTEGER PRIMARY KEY AUTOINCREMENT, " + SUBJECT
        + " TEXT NOT NULL," + TOPIC + " TEXT NOT NULL, "
        + LECTURENUMBER + " TEXT NOT NULL, " + PAGENUMBER
        + " TEXT NOT NULL, " + DATE + " TEXT NOT NULL, " + _DATA
        + " TEXT NOT NULL);");
}

Ich frage die Tabelle wie folgt ab:

String sql = "SELECT " + _ID + "," + SUBJECT + " FROM " + TABLE_NAME
    + " GROUP BY " + SUBJECT + ";";

Cursor cursor = subjects.getReadableDatabase().rawQuery(sql, null);

Das Problem ist, ich muss eine Aktivität A starten, wenn der Cursor leer ist (d. H. Die Tabelle speichert keine Werte), und Aktivität B, wenn der Cursor nicht leer ist (d. H. Die Tabelle ist gefüllt).

Ich kann keine Methode finden, die mir sagt, ob die Tabelle leer ist oder nicht .. Ich habe versucht, Log folgendermaßen zu verwenden:

private void showSubjectsOnList() {
    String sql = "SELECT " + _ID + "," + SUBJECT + " FROM " + TABLE_NAME
        + " GROUP BY " + SUBJECT + ";";

    Cursor cursor = subjects.getReadableDatabase().rawQuery(sql, null);

    Log.d("Events",Integer.toString(cursor.getCount()));
    if(cursor.isNull(0)!=false){
        cursor.close();
        subjects.close();
        startActivity(new Intent(this,OpenScreen.class));
    }
}

Das LOG zeigt jedoch 1, wenn die Tabelle leer ist, und wieder 1, wenn die Tabelle 1 Eintrag hat. Es zeigt 2, wenn die Tabelle zwei Einträge hat und so weiter.

Können Sie eine Methode vorschlagen, um mein Problem zu lösen, verschiedene Aktivitäten zu starten, basierend darauf, ob der Cursor leer ist oder nicht. 

22
Waneya Iqbal

Wie wäre es, wenn Sie den Cursor so testen und dann tun, was Sie gesagt haben:

if(cursor!=null && cursor.getCount()>0)

getCount ()

Gibt die Anzahl der Zeilen im Cursor zurück

http://developer.Android.com/reference/Android/database/Cursor.html#getCount ()

56

Die einfachste und sauberste Methode zum Testen eines leeren Cursors ist der folgende Code:

if ( cursor.moveToFirst() ) {
    // start activity a
} else {
    // start activity b
}

Die Methode gibt für die Dokumente false zurück, wenn der Cursor leer ist:

http://developer.Android.com/reference/Android/database/Cursor.html#moveToFirst%28%29

public abstract boolean moveToFirst ()

Hinzugefügt in API Level 1 Bewegen Sie den Cursor in die erste Zeile.

Diese Methode gibt false zurück, wenn der Cursor leer ist.

Gibt zurück, ob die Verschiebung erfolgreich war.

23
SBerg413

Gelöschte Datensätze bleiben in SQLite als Null-Datensätze, aber getCount() zählt nur keine Null-Datensätze. Wenn Ihre Tabelle einige Datensätze enthält, die NULL sind, werden für einige Datensätze, die nicht NULL sind, _Id-Nummern größer als das Ergebnis von getCount(). Um sie zu erreichen, können Sie den Cursor (mit for () - Schleife) doppelt so oft wie das Ergebnis von getCount() durchlaufen und den Cursor verwenden, um record_Id-Zahlen in ein Array zu füllen. Nehmen wir an, das resultierende Array ist { 1, 2, 5, 6, 7, 8, 9, 11, 12, 14 }.

Das bedeutet, dass die Datensätze 3, 4, 10, 13 Nulldatensätze sind und Ihre Tabelle insgesamt 14 Datensätze enthält, nicht 10, die Sie von getCount() erhalten haben.

Merken: 

  1. getCount() gibt die Anzahl der Datensätze zurück, die nicht null sind.
  2. cursor gibt _Id-Nummern von Datensätzen zurück, die nicht null sind.
  3. _Id-Nummern, die vom Cursor "übersehen" wurden, sind _Id-Nummern von Null-Datensätzen.
  4. muss weiter reichen als getCount(), um sie alle zu erreichen.
2
Stan

Sie müssen nur getCount () ..__ verwenden. Wenn Ihre SQL-Anweisung korrekt ist, aber keine Zeile zurückgibt, haben Sie ein NICHT-Null-Cursor-Objekt, aber ohne Zeilen, und getCount () gibt 0 zurück.

1
Minolan

Ich glaube, Ihr Problem ist, dass Sie keine richtige Abfrage erstellen.

Sie sollten die SQLiteDatabase-Abfrage verwenden.

Cursor c = db.query(TABLE_NAME, null,
            null, null, null, null, null);

Sie können dann c.getCount () verwenden, um festzustellen, ob die Tabelle etwas enthält.

0
AndroidDebaser

Mein Vorschlag wäre eine ListActivity .

Dies sind Aktivitäten, die Elemente in einer ListView anzeigen sollen. Sie können einfach eine SimpleCursorAdapter verwenden, um sie aufzufüllen (auch auf der JavaDoc-Seite ListActivitys dargestellt).

Sie bieten auch eine setEmptyView()- -Methode , mit der eine View angezeigt werden kann (möglicherweise eine TextView), die den Benutzer darüber informiert, dass noch keine Datensätze vorhanden sind und wie er eine erstellen kann.

Ein Beispiel dafür ist hier .

0
Lukas Knuth