2011-08-28 1 views
22

Ho una tabella SQL che viene creato dal seguente codice:Come per verificare se il cursore è vuota in una SQLiteDatabase query

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

interrogo la tabella come segue:

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

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

Il problema è necessario avviare un'attività A se il cursore è vuoto (ovvero la tabella non memorizza valori) e Attività B se il cursore non è vuoto (cioè la tabella è piena).

Non riesco a trovare un metodo che possa dirmi se il tavolo è vuoto o meno. Ho cercato di usato registro come segue:

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

Ma il registro mostra 1, se la tabella è vuota ... e di nuovo 1, se la tabella ha 1 ingresso .... si vede 2, se la tabella ha due voci e così via.

Potete suggerire qualche metodo per risolvere il mio problema di iniziare diverse attività in base a se il cursore è vuoto o meno.

risposta

55

Che dire testare il cursore in questo modo, e poi fare quello che hai detto:

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

getCount()

Restituisce il numero di righe nel cursore

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

+0

Non ho provato esattamente come hai menzionato. Ma ho provato ad utilizzare cursore = null così, nel modo seguente:! Log.d (! "Eventi", Boolean.toString (cursore = null)); La cosa interessante è che Log mostra true se la tabella ha alcuni valori, ma sorprendentemente il log non viene mostrato affatto se la tabella è vuota. Sono confuso cosa significa questo. –

+0

Non dimenticare di spostare il puntatore del cursore sul primo record con 'cursor.moveToFirst()' prima di provare –

+0

Significa che la tua query restituisce zero righe. Il che significa che il cursore non è nullo ma ha zero righe: D –

22

Il più semplice e pulito modo nido per testare un cursore vuoto è il seguente codice:

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

Per la documentazione, il metodo restituisce false se il cursore è vuota:

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

public abstract boolean moveToFirst ()

Aggiunto in livello API 1 Spostare il cursore sulla prima riga.

Questo metodo restituirà false se il cursore è vuoto.

Indica se lo spostamento è riuscito.

+0

Provato, ma non funziona: s –

+0

Che dire di cursore.moveToNext() ... Penso che questo restituirà true se ci sono righe e false se nessuna riga trovata ... –

+0

@KarueBensonKarue - potrebbe anche. Dai un'occhiata ai documenti. – SBerg413

0

Il mio suggerimento sarebbe utilizzare un ListActivity.

Queste sono le attività che hanno lo scopo di visualizzare gli elementi in un ListView. È possibile utilizzare semplicemente uno SimpleCursorAdapter per popolarli (anche illustrato nella pagina JavaDoc di ListActivity s).

Offrono anche una setEmptyView()-method, che può essere utilizzato per visualizzare un View (potrebbe essere un TextView), che informa l'utente che non ci sono elemento ancora e come si può creare uno.

Un esempio su come farlo può essere trovato here.

+0

Caro Lukas Knuth, –

+1

... e il resto? –

+0

Caro Lukas, L'attività B è in realtà la listaAttività. Anche il metodo showSubjectsOnList() menzionato sopra è un metodo in questa attività. Se il cursore in ShowSubjectsOnList è vuoto, voglio iniziare l'attività A, altrimenti voglio rimanere nella stessa attività ..... Ma non riesco a trovare come trovare quel cursore è vuoto. –

1

È sufficiente utilizzare getCount(). Se il tuo sql è corretto ma non restituisce alcuna riga avrai un oggetto null null null ma senza righe e getCount() restituirà 0.

+0

Si prega di elaborare. –

+0

L'oggetto del cursore viene sempre restituito quando si esegue una query sul DB. Ad esempio, contiene la stringa di query all'interno. Quindi non può essere nullo: in Java - l'identificatore che non è "connesso" a nessun oggetto è nullo. Solo se la query di selezione non ha restituito alcuna riga, getCount() restituirà zero. – Minolan

+0

Hmm..ok ... Grazie per l'elaborazione. Ma come posso risolvere il mio problema allora? –

0

Credo che il tuo problema sia che non stai creando una query corretta .

È necessario utilizzare la query SQLiteDatabase.

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

È quindi possibile utilizzare c.getCount() per determinare se la tabella ha qualcosa.

2

I record eliminati rimangono in SQLite come record null, ma getCount() conta solo i record non nulli. Se la tabella contiene alcuni record null, alcuni record non nulli avranno numeri _Id più grandi del risultato di getCount(). Per raggiungerli, è possibile iterare il cursore (usando il ciclo for()) raddoppiando il numero di volte del risultato di getCount() e utilizzare il cursore per riempire i numeri record_Id in una matrice. Diciamo che l'array risultante è { 1, 2, 5, 6, 7, 8, 9, 11, 12, 14 }.

Ciò significa che i record 3, 4, 10, 13 sono record nulli e la tabella contiene 14 record tutti insieme, non 10 ottenuti da getCount().

Ricorda:

  1. getCount() rendimenti numero di non record nulli,
  2. cursore ritorna _Id numero di non record nulli,
  3. _Id numeri "perse" di cursore sono _Id numero di record nulli,
  4. deve raggiungere un valore sufficientemente superiore a getCount() per ottenerli tutti.