SQLite
 sql >> база данни >  >> RDS >> SQLite

задайте правилно sqlite db в android

В readPos метод, вместо :-

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

Трябва да имате :-

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

Горният код работеше перфектно преди промените. Сега updatePos дава правилната стойност, но readPos винаги връща нула ....

Използване на cursor.getInt(cursor.getColumnIndex(LAST_BTN)) освен ако стойността в колоната LAST_BTN не е числова, ще върне 0 (не може да промени низа в число, така че връща 0). От вашето описание на проблема изглежда вероятно стойностите, съхранени в колоната LAST_BTN, да не са напълно числови.

  • Ако искате да получите стойност, която уникално идентифицира реда, върнете идентификатора на първичния ключ в колоната с идентификатор.

Също така не е необходимо да предавате last_btn към readPos метод, така че може да използва public int readPos(String _id) вместо public int readPos(String _id, int last_btn) .

Освен това оставяте курсора отворен, твърде много отворени курсори и приложението ще се срине. Предлагам да обмислите следното:-

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

Въпреки това, горните промени НЯМА да разрешат проблема, че readPos ще върне 0, ако стойността, съхранена в колоната LAST_BTN, е нечислова, напр. ако е "A1234", тогава резултатът ще бъде 0, ако е "1234", тогава ще бъде върнато 1234.

Пример

Като използвате вашия код (но с предложения метод readPos), след което използвайте следното:-

    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

Резултати в :-

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

т.е. според коментарите test1-test3 върнете 0 не защото ред не е намерен, а защото низът, съхранен в колоната LAST_BTN, не може да бъде преобразуван в число, така че вместо срив API на SQLite го преобразува в 0. test4 се извлича и се връща стойност, различна от 0, тъй като стойността, съхранена в LAST_BTN, може да бъде преобразувана (представлява) в число. тест5 не съществува в базата данни, така че се връща 0, защото редът не е намерен.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQLite няма такава колона

  2. 3 начина за архивиране на база данни на SQLite

  3. Създайте външен ключ в SQLite

  4. Изпълнение на Total-Order By Date в SQLite

  5. Какви са режийните разходи при използването на AUTOINCREMENT за SQLite на Android?