W readPos
metoda, zamiast :-
Cursor cursor = db.rawQuery("SELECT " + LAST_BTN + " FROM "
+TABLE_NAME+" WHERE " + _ID +" =? " });
Powinieneś mieć :-
Cursor cursor = db.rawQuery("SELECT " + LAST_BTN + " FROM "
+TABLE_NAME+" WHERE " + _ID +" =? ",new String[]{_id});
Powyższy kod działał doskonale przed zmianami. Teraz updatePos podaje poprawną wartość, ale readPos zawsze zwraca zero ....
Korzystanie z cursor.getInt(cursor.getColumnIndex(LAST_BTN))
zwróci 0 (nie można zmienić ciągu na liczbę, więc zwraca 0), chyba że wartość w kolumnie LAST_BTN jest liczbowa. Z opisu problemu wynika, że prawdopodobnie wartości przechowywane w kolumnie LAST_BTN nie są w pełni numeryczne.
- Jeśli chcesz uzyskać wartość, która jednoznacznie identyfikuje wiersz, zwróć identyfikator klucza podstawowego w kolumnie id.
Nie musisz również przekazywać last_btn do readPos
metoda, więc można użyć public int readPos(String _id)
zamiast public int readPos(String _id, int last_btn)
.
Dodatkowo pozostawiasz otwarty kursor, zbyt wiele otwartych kursorów i aplikacja ulegnie awarii. Proponuję rozważyć następujące kwestie:-
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;
}
Jednak powyższe zmiany NIE ROZWIĄZUJĄ problemu, że readPos zwróci 0, jeśli wartość przechowywana w kolumnie LAST_BTN jest nienumeryczna, np. jeśli jest to "A1234" to wynik będzie równy 0, jeśli to "1234" to 1234 zostanie zwrócone.
Przykład
Używając swojego kodu (ale z sugerowaną metodą readPos), a następnie wykonując następujące czynności:-
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
Wyniki w :-
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. zgodnie z komentarzami test1-test3 zwróć 0 nie dlatego, że nie znaleziono wiersza, ale dlatego, że ciąg przechowywany w kolumnie LAST_BTN nie może zostać przekonwertowany na liczbę, więc zamiast awarii, SQLite API konwertuje go na 0. test4 jest wyodrębniany i zwracana jest wartość różna od 0, ponieważ wartość przechowywana w LAST_BTN może zostać przekonwertowana (reprezentuje) na liczbę. test5 nie istnieje w bazie danych, więc zwracane jest 0, ponieważ nie znaleziono wiersza.