SQLite
 sql >> Baza danych >  >> RDS >> SQLite

ustaw poprawnie sqlite db w Androidzie

W readPos metoda, zamiast :-

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

Powinieneś mieć :-

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

Powyższy kod działał doskonale przed zmianami. Teraz updatePos podaje poprawną wartość, ale readPos zawsze zwraca zero ....

Korzystanie z cursor.getInt(cursor.getColumnIndex(LAST_BTN)) zwróci 0 (nie można zmienić ciągu na liczbę, więc zwraca 0), chyba że wartość w kolumnie LAST_BTN jest liczbowa. Z opisu problemu wynika, że ​​prawdopodobnie wartości przechowywane w kolumnie LAST_BTN nie są w pełni numeryczne.

  • Jeśli chcesz uzyskać wartość, która jednoznacznie identyfikuje wiersz, zwróć identyfikator klucza podstawowego w kolumnie id.

Nie musisz również przekazywać last_btn do readPos metoda, więc można użyć public int readPos(String _id) zamiast public int readPos(String _id, int last_btn) .

Dodatkowo pozostawiasz otwarty kursor, zbyt wiele otwartych kursorów i aplikacja ulegnie awarii. Proponuję rozważyć następujące kwestie:-

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

Jednak powyższe zmiany NIE ROZWIĄZUJĄ problemu, że readPos zwróci 0, jeśli wartość przechowywana w kolumnie LAST_BTN jest nienumeryczna, np. jeśli jest to "A1234" to wynik będzie równy 0, jeśli to "1234" to 1234 zostanie zwrócone.

Przykład

Używając swojego kodu (ale z sugerowaną metodą readPos), a następnie wykonując następujące czynności:-

    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

Wyniki w :-

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

tj. zgodnie z komentarzami test1-test3 zwróć 0 nie dlatego, że nie znaleziono wiersza, ale dlatego, że ciąg przechowywany w kolumnie LAST_BTN nie może zostać przekonwertowany na liczbę, więc zamiast awarii, SQLite API konwertuje go na 0. test4 jest wyodrębniany i zwracana jest wartość różna od 0, ponieważ wartość przechowywana w LAST_BTN może zostać przekonwertowana (reprezentuje) na liczbę. test5 nie istnieje w bazie danych, więc zwracane jest 0, ponieważ nie znaleziono wiersza.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Radzenie sobie z konfliktami kluczy podstawowych podczas wstawiania danych do SQLite

  2. SQLite JSON_ARRAY()

  3. dane załadowane z bazy danych SQLitE nie są zapisywane w klasie modelu ArrayList android

  4. Umieszczanie danych kursora w tablicy

  5. Logcat mówi niepoprawne dane kolumny 1