sql >> Databasteknik >  >> RDS >> SQLite

ställ in sqlite db korrekt i Android

I readPos metod istället för :-

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

Du borde ha :-

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

Ovanstående kod fungerade perfekt innan ändringarna. Nu ger updatePos rätt värde men readPos returnerar alltid noll ....

Använda cursor.getInt(cursor.getColumnIndex(LAST_BTN)) kommer, om inte värdet i kolumnen LAST_BTN är numeriskt, returnera 0 (kan inte ändra strängen till ett tal så returnerar 0). Från din beskrivning av problemet verkar det troligt att värdena som lagras i kolumnen LAST_BTN inte är helt numeriska.

  • Om du vill få ett värde som unikt identifierar raden, returnera primärnyckel-id:t kolumnen id.

Du behöver inte heller skicka last_btn till readPos metod, så skulle kunna använda public int readPos(String _id) istället för public int readPos(String _id, int last_btn) .

Dessutom lämnar du markören öppen, för många öppna markörer och appen kommer att krascha. Jag skulle föreslå att du överväger följande:-

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

Ändringarna ovan KOMMER dock INTE att lösa problemet att readPos returnerar 0 om värdet som lagras i LAST_BTN kolumnen är icke-numeriskt t.ex. om det är "A1234" blir resultatet 0, om det är "1234" kommer 1234 att returneras.

Exempel

Använd din kod (men med den föreslagna readPos-metoden) och använd sedan följande:-

    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

Resultat i :-

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

dvs enligt kommentarerna test1-test3 returnera 0 inte för att en rad inte hittades utan för att strängen som är lagrad i kolumnen LAST_BTN inte kan konverteras till ett tal så istället för att krascha konverterar SQLite API:et till 0. test4 extraheras och ett icke 0-värde returneras eftersom värdet lagrat i LAST_BTN kan konverteras (representerar) till ett tal. test5 finns inte i databasen så 0 returneras eftersom raden inte hittades.




  1. Installera och anslut till PostgreSQL 10 på Ubuntu 16.04

  2. Parallellism kommer till VAKUUM

  3. En checklista för efterlevnad av SOx för PostgreSQL

  4. Databas hög tillgänglighet för Camunda BPM med MySQL eller MariaDB Galera Cluster