sql >> Database teknologi >  >> RDS >> SQLite

Indstil sqlite db korrekt i Android

I readPos metode i stedet for :-

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

Du skal have :-

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

Ovenstående kode fungerede perfekt før ændringerne. Nu giver updatePos den korrekte værdi, men readPos returnerer altid nul ....

Brug af cursor.getInt(cursor.getColumnIndex(LAST_BTN)) vil, medmindre værdien i LAST_BTN-kolonnen er numerisk, returnere 0 (kan ikke ændre streng til et tal, så returnerer 0). Ud fra din beskrivelse af problemet virker det sandsynligt, at de værdier, der er gemt i kolonnen LAST_BTN, ikke er helt numeriske.

  • Hvis du vil have en værdi, der unikt identificerer rækken, skal du returnere den primære nøgle-id til id-kolonnen.

Du behøver heller ikke sende last_btn til readPos metode, så kunne bruge public int readPos(String _id) i stedet for public int readPos(String _id, int last_btn) .

Derudover forlader du markøren åben, for mange åbne markører, og appen vil gå ned. Jeg vil foreslå, at du overvejer følgende:-

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

Ovenstående ændringer VIL dog IKKE løse problemet med, at readPos returnerer 0, hvis værdien gemt i LAST_BTN kolonnen er ikke-numerisk, f.eks. hvis det er "A1234", vil resultatet være 0, hvis det er "1234", vil 1234 blive returneret.

Eksempel

Brug din kode (men med den foreslåede readPos-metode) og brug derefter følgende:-

    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

Resultater 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. ifølge kommentarerne test1-test3 returner 0, ikke fordi en række ikke blev fundet, men fordi strengen, der er gemt i LAST_BTN-kolonnen, ikke kan konverteres til et tal, så i stedet for at crashe, konverterer SQLite API den 0. test4 udtrækkes, og en ikke 0-værdi returneres, fordi værdien, der er gemt i LAST_BTN, kan konverteres (repræsenterer) til et tal. test5 eksisterer ikke i databasen, så 0 returneres, fordi rækken ikke blev fundet.




  1. Returner en liste over alle serverudløsere i SQL Server

  2. Hvordan gendanner man en enkelt tabel fra en .sql postgresql backup?

  3. Brug Firebase DB med lokal DB

  4. Sådan installeres og konfigureres ClickHouse på Ubuntu 20.04