it-swarm.com.de

Wie kann ich überprüfen, ob meine SQLite-Tabelle Daten enthält?

BEARBEITEN, Code etwas basierend auf den Antworten unten geändert, aber noch nicht funktioniert. Ich habe auch eine Protokollnachricht hinzugefügt, die mich darüber informiert, ob getCount> 0 zurückgegeben hat. Dies war also der Fall. Ich vermute, dass etwas mit meiner Abfrage nicht stimmt. oder meine Verwendung des Cursors ..

Ich habe eine Tabelle erstellt, und ich möchte prüfen, ob sie leer ist oder nicht. Wenn sie leer ist, möchte ich einige Insert-Anweisungen ausführen (die in einem Array gespeichert sind).

Unten ist mein Code, während ich keine Fehler habe. Wenn ich die .db-Datei herausziehe, kann ich sehen, dass es nicht funktioniert. Wie würden Sie dieses Problem angehen?

public void onCreate(SQLiteDatabase db) {
        Log.i("DB onCreate", "Creating the database...");//log message
        db.execSQL(createCATBUDTAB);
        db.execSQL(createTWOWEETAB);
        try{
            Cursor cur = db.rawQuery("SELECT COUNT(*) FROM CAT_BUD_TAB", null);
        if (cur.getCount() > 0){
            Log.i("DB getCount", " getcount greater than 0");//log message
            //do nothing everything's as it should be
        }
        else{//put in these insert statements contained in the array
            Log.i("DB getCount", " getcount less than 0, should read array");//log message
            for(int i=0; i<13; i++){
                db.execSQL(catInsertArray[i]);
            }
        }
        }catch(SQLiteException e){System.err.println("Exception @ rawQuery: " + e.getMessage());}
    }

Tut mir leid, wenn dies eine ziemlich dumme Frage oder Herangehensweise ist. Ich bin neu bei all dem. Alle Antworten sehr geschätzt!

12
Holly

Die Abfrage SELECT COUNT(*) für eine vorhandene Tabelle sollte never null zurückgeben. Wenn die Tabelle keine Zeilen enthält, sollte eine Zeile mit dem Wert Null zurückgegeben werden.

Umgekehrt gibt eine Zeile mit einem Wert ungleich Null an, dass sie nicht leer ist.

In beiden Fällen sollte eine Zeile zurückgegeben werden

//do nothing everything's as it should be

sektion.

Um dies zu beheben, lassen Sie Ihre Abfrage unverändert (Sie möchten select column_name nicht ausführen, nur weil dies unnötig und möglicherweise ein wenig ineffizient wäre). Belassen Sie es als select count(*), das immer eine Zeile zurückgibt, und verwenden Sie den folgenden Code (nur in meinem Kopf getestet, also seien Sie vorsichtig):

Cursor cur = db.rawQuery("SELECT COUNT(*) FROM CAT_BUD_TAB", null);
if (cur != null) {
    cur.moveToFirst();                       // Always one row returned.
    if (cur.getInt (0) == 0) {               // Zero count means empty table.
        for (int i = 0; i < 13; i++) {
            db.execSQL (catInsertArray[i]);
        }
    }
}
31
paxdiablo

Die rawQuery gibt ein Cursor-Objekt zurück, das vor dem ersten Eintrag positioniert ist. (Weitere Informationen hier ) SELECT COUNT(*) gibt immer ein Ergebnis zurück (vorausgesetzt, die Tabelle existiert).

Also würde ich tun:

if (cur != null){
    cur.moveToFirst();
    if (cur.getInt(0) == 0) {
      // Empty 
    }

}
7
ccheneson

Wie paxdiablo sagte, wird der Cursor nicht null sein. Was Sie tun können, ist wie folgt zu versuchen:

if (cur != null && cur.getCount() > 0){
     // do nothing, everything's as it should be
}

EDIT

Eigentlich hatte ich die db.query () benutzt und es hat bei mir funktioniert. Ich tat dies.

cursor = db.query(TABLE_NAME, new String[] { KEY_TYPE }, null, null, null, null, null);
if (cursor != null && cursor.getCount() > 0)
{
   retVal = true;
}

TABLE_NAME ist meine Tabelle und KEY_TYPE war mein Spaltenname

5
Varun

Sie können es manuell überprüfen:

  1. Wechseln Sie im Datei-Explorer zu DDMS. /data/data/(your application package)/databases Hier erhalten Sie Ihre Datenbankdatei. Und wenn Sie eingefügte Werte in der Tabelle sehen wollen.

  2. Kopieren Sie die Dateien adb, aapt, AdbWinApi.dll und AdbWinUsbApi.dll von platform_tools in den Ordner tools.

  3. Öffnen Sie dann die Eingabeaufforderung und legen Sie den Pfad zum Verzeichnis "Tools" fest, in dem sich Ihr Android-Setup befindet. Es sieht so aus: - (Local Drive):\Android\android-sdk-windows\tools

  4. Nach set path schreiben Sie den Befehl "adb Shell" ohne Anführungszeichen. E:\Developers\Android\android-sdk-windows\tools> adb Shell

  5. Drücken Sie die Eingabetaste und schreiben Sie den oben angegebenen DDMS-Pfad: - # sqlite3 /data/data/(Your Application Package)/databases/name of database

  6. Drücken Sie die Eingabetaste sqlite>.tables

  7. Drücken Sie die Eingabetaste. Der gesamte Tabellenname ist in dieser Datenbank vorhanden.

sqlite> Select * from table name

Alle in dieser Tabelle vorhandenen Daten werden angezeigt.

Für weitere Fragen stehen wir Ihnen gerne zur Verfügung.

2
Android Expert

meinst du, wenn es richtig aufgenommen hat? Ich habe es versucht und für mich ist es Arbeit

    dbCur = db.rawQuery("select * from player", null);
    Log.e("a", ""+dbCur.getCount());

es wird die Summe der Tabelle angezeigt. Wenn in der Tabelle kein Datensatz vorhanden ist, wird 0 angezeigt.

2
flowoverstack

Meine Art zu überprüfen war ungefähr so:

Cursor cursor = db.query(DbHelper.DB_NAME,DbHelper.DB_C_ID_ONLY,null,null,null,null,null);
if(cursor.isAfterLast())

Ich erhalte die _id-Einträge, die in meinem Fall automatisch inkrementiert werden. Wenn die Datenbank leer ist, gibt isAfterLast mit Sicherheit true zurück.

1
Jimmy

Was ist mit dieser Abfrage?

SELECT CASE WHEN EXISTS (SELECT * FROM CAT_BUD_TAB) THEN 1 ELSE 0 END

Es ist etwas schneller als SELECT COUNT(*).

P.S. Überprüft auf Tabellen mit 9 Millionen Zeilen.

1
bellum

Eine andere Alternative zu der bereits erwähnten wäre die Verwendung der Funktion queryNumEntries from de class DatabaseUtils .

Ein Beispiel könnte sein:

public boolean checkEmpty(SQLiteDatabase db, String table){
        return DatabaseUtils.queryNumEntries(db, table) == 0;
}
1
Joacer

für Java-Programme hat das bei mir funktioniert:

    ResultSet rst = stm.executeQuery("SELECT * from Login");
           int i = 0;
           while(rst.next()){
               ++i;
               System.out.println(i);
           }
           System.out.println(i);
           if(i<1){
               //No data in the table
           }
           else{
               //data exists
           }
1
Mohd Zaid
public boolean isEmpty(String TableName){

SQLiteDatabase database = this.getReadableDatabase();
return (int) DatabaseUtils.queryNumEntries(database,TableName) == 0;
}
0
Mahesh Uligade

Folgendes habe ich getan ...

Cursor cur = db.rawQuery("SELECT count(*) FROM " + SQLHelper.TABLE_CART, null);
if (cur != null && cur.moveToFirst() && cur.getInt(0) > 0) {
    Log.i(getClass().getName(), "table not empty");
} 
else {
    Log.i(getClass().getName(), "table is empty");
}
0
MCR

Meine App stürzte ab, als ich die obigen Codes ausprobierte, also habe ich das gemacht und jetzt funktioniert es perfekt!

public boolean checkIfEmpty()
{
    Cursor cursor = getDatabase().query(DatabaseHelper.Products.TABLE,
            DatabaseHelper.Products.COLUMNS, null, null, null, null, null);

    if (cursor != null)
    {
        try
        {
            //if it is empty, returns true.
            cursor.moveToFirst();
            if (cursor.getInt(0) == 0)
                return true;
            else
                return false;
        }

        //this error usually occurs when it is empty. So i return true as well. :)
        catch(CursorIndexOutOfBoundsException e)
        {
            return true;
        }

    }
    return false;
}
0
PossessWithin