web-dev-qa-db-fra.com

Comment vérifier si le curseur est vide dans une requête SQLiteDatabase

J'ai une table SQL qui est créée par le code suivant:

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

J'interroge la table comme suit:

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

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

Le problème est que je dois démarrer une activité A si le curseur est vide (c'est-à-dire que la table ne stocke aucune valeur) et l'activité B si le curseur n'est pas vide (c'est-à-dire que la table est remplie).

Je suis incapable de trouver une méthode qui peut me dire si la table est vide ou non .. J'ai essayé d'utiliser Log comme suit:

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

Mais le journal montre 1, si le tableau est vide ... et encore 1, si le tableau a 1 entrée .... il en montre 2, si le tableau a deux entrées et ainsi de suite.

Pouvez-vous suggérer une méthode pour résoudre mon problème de démarrage de différentes activités en fonction du fait que le curseur soit vide ou non. 

22
Waneya Iqbal

Qu'en est-il de tester le curseur comme ceci, puis de faire ce que vous avez dit:

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

getCount ()

Retourne le nombre de lignes dans le curseur

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

56
Nikola Despotoski

Le moyen le plus simple et le plus propre de rechercher un curseur vide est le code suivant:

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

Selon la documentation, la méthode retourne false si le curseur est vide:

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

public abstrait boolean moveToFirst ()

Ajouté dans l'API niveau 1 Déplacez le curseur sur la première ligne.

Cette méthode retournera false si le curseur est vide.

Retourne si le déplacement a réussi.

23
SBerg413

Les enregistrements supprimés restent dans SQLite en tant qu'enregistrements nuls, mais getCount() ne compte que les enregistrements non nuls. Si votre table contient des enregistrements nuls, certains des enregistrements non nuls auront des numéros _Id plus grands que le résultat de getCount(). Pour les atteindre, vous pouvez itérer le curseur (en utilisant la boucle for ()) doubler le nombre de fois que le résultat de getCount() et utiliser le curseur pour remplir les nombres record_Id dans un tableau. Disons que le tableau résultant est { 1, 2, 5, 6, 7, 8, 9, 11, 12, 14 }.

Cela signifie que les enregistrements 3, 4, 10, 13 sont nuls et que votre table contient 14 enregistrements au total, et non 10 que vous avez obtenus de getCount().

Rappelles toi: 

  1. getCount() renvoie le nombre d'enregistrements non nuls,
  2. le curseur retourne _Id nombre d'enregistrements non nuls,
  3. _Id nombres "manqués" par le curseur sont _Id nombres d’enregistrements nuls,
  4. doit atteindre suffisamment plus que getCount() pour les avoir tous.
2
Stan

Vous devez juste utiliser getCount () . Si votre SQL est correct mais ne renvoie aucune ligne, vous aurez un objet curseur NON null, mais sans ligne et getCount () retournera 0.

1
Minolan

Je crois que votre problème est que vous ne créez pas une requête appropriée.

Vous devez utiliser la requête SQLiteDatabase.

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

Vous pouvez ensuite utiliser c.getCount () pour déterminer si la table a quelque chose.

0
AndroidDebaser

Ma suggestion serait d'utiliser un ListActivity .

Ce sont des activités qui sont censées afficher des éléments dans une ListView. Vous pouvez simplement utiliser SimpleCursorAdapter pour les remplir (également illustré dans la page ListActivitys JavaDoc).

Ils proposent également une méthode setEmptyView()- [ , qui peut être utilisée pour afficher une variable View (pouvant être une TextView) qui informe l'utilisateur qu'il n'existe pas encore d'enregistrements et comment il peut en créer.

On trouvera un exemple sur la façon de faire cela ici .

0
Lukas Knuth