sql >> Base de Datos >  >> RDS >> SQLite

configurar sqlite db correctamente en android

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.