sql >> Databáze >  >> RDS >> SQLite

správně nastavit sqlite db v Androidu

V readPos metoda místo :-

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

Měli byste mít :-

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

Výše uvedený kód fungoval před změnami naprosto v pořádku. Nyní updatePos dává správnou hodnotu, ale readPos vždy vrací nulu ....

Pomocí cursor.getInt(cursor.getColumnIndex(LAST_BTN)) pokud není hodnota ve sloupci LAST_BTN číselná, vrátí 0 (nelze změnit řetězec na číslo, takže vrátí 0). Z vašeho popisu problému se pak zdá pravděpodobné, že hodnoty uložené ve sloupci LAST_BTN nejsou plně číselné.

  • Pokud chcete získat hodnotu, která jednoznačně identifikuje řádek, vraťte primární klíč id sloupec id.

Last_btn také nemusíte předávat do readPos metodu, takže můžete použít public int readPos(String _id) místo public int readPos(String _id, int last_btn) .

Navíc necháte otevřený kurzor, příliš mnoho otevřených kurzorů a aplikace se zhroutí. Navrhoval bych zvážit následující:-

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

Výše uvedené změny však NEVYŘEŠÍ problém, že readPos vrátí 0, pokud hodnota uložená ve sloupci LAST_BTN není číselná, např. pokud je to "A1234", bude výsledek 0, pokud je "1234", bude vráceno 1234.

Příklad

Pomocí vašeho kódu (ale s doporučenou metodou readPos) poté pomocí následujícího:-

    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

Výsledky v :-

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

tj. podle komentářů test1-test3 vrátí 0 ne proto, že řádek nebyl nalezen, ale proto, že řetězec uložený ve sloupci LAST_BTN nelze převést na číslo, takže místo selhání SQLite API jej převede na 0. test4 je extrahován a je vrácena hodnota jiná než 0, protože hodnotu uloženou v LAST_BTN lze převést (představuje) na číslo. test5 v databázi neexistuje, takže je vrácena 0, protože řádek nebyl nalezen.




  1. Příklad klauzule Oracle Trigger WHEN

  2. SQL Server Collection Inventory Script -1

  3. Úroveň izolace SNAPSHOT

  4. MySQL, zřetězit dva sloupce