SQLite
 sql >> Datenbank >  >> RDS >> SQLite

Stellen Sie sqlite db in Android richtig ein

In der readPos Methode statt :-

Cursor cursor = db.rawQuery("SELECT " + LAST_BTN + " FROM "
                +TABLE_NAME+" WHERE " + _ID +" =? " });

Sie sollten haben:-

Cursor cursor = db.rawQuery("SELECT " + LAST_BTN + " FROM "
            +TABLE_NAME+" WHERE " + _ID +" =? ",new String[]{_id});

Der obige Code hat vor den Änderungen einwandfrei funktioniert. Jetzt gibt die updatePos den korrekten Wert zurück, aber die readPos gibt immer Null zurück ....

Verwenden von cursor.getInt(cursor.getColumnIndex(LAST_BTN)) wird 0 zurückgeben, es sei denn, der Wert in der Spalte LAST_BTN ist numerisch (Zeichenfolge kann nicht in eine Zahl geändert werden, daher wird 0 zurückgegeben). Aus Ihrer Beschreibung des Problems geht hervor, dass die in der Spalte LAST_BTN gespeicherten Werte nicht vollständig numerisch sind.

  • Wenn Sie einen Wert erhalten möchten, der die Zeile eindeutig identifiziert, geben Sie die Primärschlüssel-ID in der ID-Spalte zurück.

Sie müssen last_btn auch nicht an readPos übergeben -Methode, könnte also public int readPos(String _id) verwenden statt public int readPos(String _id, int last_btn) .

Außerdem lassen Sie den Cursor offen, zu viele offene Cursor und die App stürzt ab. Ich würde vorschlagen, Folgendes in Betracht zu ziehen:-

public int readPos(String _id) {
    int rv = 0;
    SQLiteDatabase db = this.getReadableDatabase();
    Cursor cursor = db.rawQuery("SELECT " + LAST_BTN + " FROM "
            +TABLE_NAME+" WHERE " + _ID +" =? ",new String[]{_id});
    if(cursor.moveToFirst()) {
        rv = cursor.getInt(cursor.getColumnIndex(LAST_BTN));
    }
    cursor.close();
    return rv;
}

Die obigen Änderungen lösen jedoch NICHT das Problem, dass readPos 0 zurückgibt, wenn der in der Spalte LAST_BTN gespeicherte Wert nicht numerisch ist, z. Wenn es "A1234" ist, ist das Ergebnis 0, wenn es "1234" ist, wird 1234 zurückgegeben.

Beispiel

Verwenden Sie Ihren Code (aber mit der vorgeschlagenen readPos-Methode) und verwenden Sie dann Folgendes:-

    DBHelper dbHelper = new DBHelper(this);
    SQLiteDatabase db = dbHelper.getWritableDatabase();
    db.execSQL("INSERT INTO " + DBHelper.TABLE_NAME
            + "(_id,LAST_BTN,button_no)"
            + "VALUES "
            + "('test1','last_button1','button1')"
            +  ",('test2','last_button2','button2')"
            + ",('test3','last_button3','button3')"
            + ",('test4','199','button4')"
            + ";"
    );

    Log.d("DBINFO","Result of readPos for test1 is " + dbHelper.readPos("test1")); // 0 as last_button1 is not a number
    Log.d("DBINFO","Result of readPos for test2 is " + dbHelper.readPos("test2")); // 0 as last_button2 is not a number
    Log.d("DBINFO","Result of readPos for test3 is " + dbHelper.readPos("test3")); // 0 as last_button3 is not a number
    Log.d("DBINFO","Result of readPos for test4 is " + dbHelper.readPos("test4")); // 199 as 199 is a number
    Log.d("DBINFO","Result of readPos for test5 is " + dbHelper.readPos("test5")); // 0 as no row found

Ergebnisse in:-

D/DBINFO: Result of readPos for test1 is 0
D/DBINFO: Result of readPos for test2 is 0
D/DBINFO: Result of readPos for test3 is 0
D/DBINFO: Result of readPos for test4 is 199
D/DBINFO: Result of readPos for test5 is 0

d.h. gemäß den Kommentaren test1-test3 geben Sie 0 zurück, nicht weil eine Zeile nicht gefunden wurde, sondern weil die in der Spalte LAST_BTN gespeicherte Zeichenfolge nicht in eine Zahl konvertiert werden kann, sodass die SQLite-API sie in 0 konvertiert, anstatt sie zum Absturz zu bringen. test4 extrahiert und ein Wert ungleich 0 wird zurückgegeben, weil der in LAST_BTN gespeicherte Wert in eine Zahl umgewandelt werden kann (repräsentiert). test5 existiert nicht in der Datenbank, daher wird 0 zurückgegeben, da die Zeile nicht gefunden wurde.