SQLite
 sql >> Base de Dados >  >> RDS >> SQLite

definir sqlite db corretamente no android


No readPos método, em vez de:-
Cursor cursor = db.rawQuery("SELECT " + LAST_BTN + " FROM "
                +TABLE_NAME+" WHERE " + _ID +" =? " });

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

O código acima estava funcionando perfeitamente bem antes das alterações. Agora o updatePos dá o valor correto mas o readPos sempre retorna zero....

Usando cursor.getInt(cursor.getColumnIndex(LAST_BTN)) irá, a menos que o valor na coluna LAST_BTN seja numérico, retornará 0 (não é possível alterar a string em um número, então retorna 0). Pela sua descrição do problema, parece provável que os valores armazenados na coluna LAST_BTN não sejam totalmente numéricos.
  • Se você quiser obter um valor que identifique exclusivamente a linha, retorne o ID da chave primária na coluna do ID.

Você também não precisa passar last_btn para o readPos método, então poderia usar public int readPos(String _id) em vez de public int readPos(String _id, int last_btn) .

Além disso, você está deixando o cursor aberto, muitos cursores abertos e o aplicativo travará. Sugiro considerar o seguinte:-
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;
}

No entanto, as alterações acima NÃO resolverão o problema de que readPos retornará 0 se o valor armazenado na coluna LAST_BTN não for numérico, por exemplo. se for "A1234", o resultado será 0, se for "1234", será retornado 1234.

Exemplo

Usando seu código (mas com o método readPos sugerido) e usando o seguinte:-
    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

Resulta em :-
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

ou seja, conforme os comentários test1-test3 retorne 0 não porque uma linha não foi encontrada, mas porque a string armazenada na coluna LAST_BTN não pode ser convertida em um número, então, em vez de travar, a API SQLite a converte em 0. test4 é extraído e um valor diferente de 0 é retornado porque o valor armazenado no LAST_BTN pode ser convertido (representa) em um número. teste5 não existe no banco de dados, então 0 é retornado porque a linha não foi encontrada.