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.