SQLite
 sql >> Base de données >  >> RDS >> SQLite

définir sqlite db correctement dans android

Dans le readPos méthode, au lieu de :-

Cursor cursor = db.rawQuery("SELECT " + LAST_BTN + " FROM "
                +TABLE_NAME+" WHERE " + _ID +" =? " });

Vous devriez avoir :-

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

Le code ci-dessus fonctionnait parfaitement bien avant les changements. Maintenant, le updatePos donne la valeur correcte mais le readPos renvoie toujours zéro ....

Utilisation de cursor.getInt(cursor.getColumnIndex(LAST_BTN)) va, à moins que la valeur dans la colonne LAST_BTN soit numérique, retourner 0 (impossible de changer la chaîne en nombre donc retourne 0). D'après votre description du problème, il semble probable que les valeurs stockées dans la colonne LAST_BTN ne soient pas entièrement numériques.

  • Si vous souhaitez obtenir une valeur qui identifie de manière unique la ligne, renvoyez l'identifiant de clé primaire dans la colonne d'identifiant.

Vous n'avez pas non plus besoin de passer last_btn au readPos méthode, donc pourrait utiliser public int readPos(String _id) au lieu de public int readPos(String _id, int last_btn) .

De plus, vous laissez le curseur ouvert, trop de curseurs ouverts et l'application se bloque. Je suggérerais de considérer ce qui suit :-

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;
}

Cependant, les modifications ci-dessus NE résoudront PAS le problème selon lequel readPos renverra 0 si la valeur stockée dans la colonne LAST_BTN n'est pas numérique, par ex. si c'est "A1234" alors le résultat sera 0, si c'est "1234" alors 1234 sera retourné.

Exemple

En utilisant votre code (mais avec la méthode readPos suggérée) puis en utilisant ce qui suit :-

    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

Résultats 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

c'est-à-dire selon les commentaires test1-test3 renvoie 0 non pas parce qu'une ligne n'a pas été trouvée, mais parce que la chaîne stockée dans la colonne LAST_BTN ne peut pas être convertie en nombre, donc au lieu de planter, l'API SQLite la convertit en 0. test4 est extrait et une valeur non 0 est retournée car la valeur stockée dans le LAST_BTN peut être convertie en un nombre. test5 n'existe pas dans la base de données, donc 0 est renvoyé car la ligne n'a pas été trouvée.