sql >> Database >  >> RDS >> SQLite

stel sqlite db correct in op Android

In de readPos methode, in plaats van:-

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

Je zou moeten hebben:-

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

De bovenstaande code werkte prima vóór de wijzigingen. Nu geeft de updatePos de juiste waarde, maar de readPos retourneert altijd nul ....

Met behulp van cursor.getInt(cursor.getColumnIndex(LAST_BTN)) zal, tenzij de waarde in de LAST_BTN-kolom numeriek is, 0 retourneren (kan string niet in een getal veranderen, dus retourneert 0). Uit uw beschrijving van het probleem lijkt het waarschijnlijk dat de waarden die zijn opgeslagen in de LAST_BTN-kolom niet volledig numeriek zijn.

  • Als u een waarde wilt krijgen die de rij uniek identificeert, retourneert u de primaire sleutel id de id-kolom.

U hoeft last_btn ook niet door te geven aan de readPos methode, dus zou public int readPos(String _id) . kunnen gebruiken in plaats van public int readPos(String _id, int last_btn) .

Bovendien laat u de cursor open staan, te veel open cursors en de app crasht. Ik stel voor om het volgende te overwegen:-

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

De bovenstaande wijzigingen ZULLEN echter NIET het probleem oplossen dat readPos 0 retourneert als de waarde die is opgeslagen in de LAST_BTN-kolom niet-numeriek is, b.v. als het "A1234" is, is het resultaat 0, als het "1234" is, wordt 1234 geretourneerd.

Voorbeeld

Gebruik uw code (maar met de voorgestelde readPos-methode) en gebruik vervolgens het volgende:-

    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

Resultaten 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.w.z. volgens de opmerkingen test1-test3 retourneer 0 niet omdat er geen rij is gevonden, maar omdat de tekenreeks die is opgeslagen in de LAST_BTN-kolom niet kan worden geconverteerd naar een getal, dus in plaats van te crashen, converteert de SQLite-API het naar 0. test4 wordt geëxtraheerd en een niet-0-waarde wordt geretourneerd omdat de waarde die is opgeslagen in de LAST_BTN kan worden geconverteerd (vertegenwoordigt) naar een getal. test5 bestaat niet in de database, dus 0 wordt geretourneerd omdat de rij niet is gevonden.




  1. Onderdruk waarschuwingsberichten met mysql vanuit Terminal, maar wachtwoord geschreven in bash-script

  2. 4 manieren om alle weergaven in een MariaDB-database weer te geven

  3. MySQL Show Grants voor alle gebruikers

  4. TRANSLATE() Functie in Oracle