En el readPos
método, en lugar de :-
Cursor cursor = db.rawQuery("SELECT " + LAST_BTN + " FROM "
+TABLE_NAME+" WHERE " + _ID +" =? " });
Deberías tener:-
Cursor cursor = db.rawQuery("SELECT " + LAST_BTN + " FROM "
+TABLE_NAME+" WHERE " + _ID +" =? ",new String[]{_id});
El código anterior funcionaba perfectamente bien antes de los cambios. Ahora updatePos da el valor correcto pero readPos siempre devuelve cero...
Usando cursor.getInt(cursor.getColumnIndex(LAST_BTN))
devolverá 0, a menos que el valor en la columna LAST_BTN sea numérico, (no se puede cambiar la cadena a un número, por lo que devuelve 0). Según su descripción del problema, parece probable que los valores almacenados en la columna LAST_BTN no sean completamente numéricos.
- Si desea obtener un valor que identifique de forma única la fila, devuelva la identificación de la clave principal en la columna de identificación.
Tampoco necesita pasar last_btn a readPos
método, entonces podría usar public int readPos(String _id)
en lugar de public int readPos(String _id, int last_btn)
.
Además, está dejando el cursor abierto, demasiados cursores abiertos y la aplicación se bloqueará. Sugeriría considerar lo siguiente:-
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;
}
Sin embargo, los cambios anteriores NO resolverán el problema de que readPos devolverá 0 si el valor almacenado en la columna LAST_BTN no es numérico, p. si es "A1234", el resultado será 0, si es "1234", se devolverá 1234.
Ejemplo
Usando su código (pero con el método readPos sugerido) y luego usando lo siguiente:-
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
Resultados en :-
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
es decir, según los comentarios test1-test3 devuelve 0 no porque no se haya encontrado una fila, sino porque la cadena almacenada en la columna LAST_BTN no se puede convertir en un número, por lo que en lugar de fallar, la API de SQLite la convierte en 0. test4 se extrae y se devuelve un valor distinto de 0 porque el valor almacenado en LAST_BTN se puede convertir (representa) en un número. prueba5 no existe en la base de datos, por lo que se devuelve 0 porque no se encontró la fila.