SQLite
 sql >> Database >  >> RDS >> SQLite

imposta sqlite db correttamente in Android

Nel readPos metodo, invece di :-

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

Dovresti avere :-

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

Il codice sopra funzionava perfettamente prima delle modifiche. Ora updatePos fornisce il valore corretto ma readPos restituisce sempre zero ....

Utilizzo di cursor.getInt(cursor.getColumnIndex(LAST_BTN)) a meno che il valore nella colonna LAST_BTN non sia numerico, restituirà 0 (non è possibile modificare la stringa in un numero, quindi restituisce 0). Dalla tua descrizione del problema, sembra probabile che i valori memorizzati nella colonna LAST_BTN non siano completamente numerici.

  • Se vuoi ottenere un valore che identifichi in modo univoco la riga, restituisci la chiave primaria id la colonna id.

Inoltre, non è necessario passare last_btn a readPos metodo, quindi potrebbe usare public int readPos(String _id) invece di public int readPos(String _id, int last_btn) .

Inoltre, stai lasciando il cursore aperto, troppi cursori aperti e l'app si arresterà in modo anomalo. Suggerirei di considerare quanto segue:-

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

Tuttavia, le modifiche precedenti NON risolveranno il problema che readPos restituirà 0 se il valore memorizzato nella colonna LAST_BTN non è numerico, ad es. se è "A1234" il risultato sarà 0, se è "1234" verrà restituito 1234.

Esempio

Usando il tuo codice (ma con il metodo readPos suggerito), quindi usando quanto segue:-

    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

Risultati 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

cioè come per i commenti test1-test3 restituisce 0 non perché non è stata trovata una riga, ma perché la stringa memorizzata nella colonna LAST_BTN non può essere convertita in un numero, quindi invece di arrestarsi in modo anomalo l'API SQLite la converte 0. test4 viene estratto e viene restituito un valore diverso da 0 perché il valore memorizzato in LAST_BTN può essere convertito(rappresenta) in un numero. test5 non esiste nel database, quindi viene restituito 0 perché la riga non è stata trovata.