SQLite
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> SQLite

đặt sqlite db đúng cách trong android

Trong readPos thay vì:-

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

Bạn nên có:-

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

Đoạn mã trên hoạt động hoàn toàn tốt trước khi có những thay đổi. Bây giờ updatePos cung cấp giá trị chính xác nhưng readPos luôn trả về 0 ....

Sử dụng cursor.getInt(cursor.getColumnIndex(LAST_BTN)) sẽ, trừ khi giá trị trong cột LAST_BTN là số, trả về 0 (không thể thay đổi chuỗi thành số nên trả về 0). Từ mô tả của bạn về sự cố, thì có vẻ như các giá trị được lưu trữ trong cột LAST_BTN không phải là số hoàn toàn.

  • Nếu bạn muốn nhận một giá trị xác định duy nhất hàng thì hãy trả về id của khóa chính cho cột id.

Bạn cũng không cần chuyển last_btn đến readPos , vì vậy có thể sử dụng public int readPos(String _id) thay vì public int readPos(String _id, int last_btn) .

Ngoài ra, bạn đang để con trỏ mở, quá nhiều Con trỏ đang mở và Ứng dụng sẽ bị treo. Tôi khuyên bạn nên xem xét những điều sau:-

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

Tuy nhiên, những thay đổi ở trên SẼ KHÔNG giải quyết được vấn đề readPos sẽ trả về 0 nếu giá trị được lưu trữ trong cột LAST_BTN không phải là số, ví dụ:nếu là "A1234" thì kết quả sẽ là 0, nếu là "1234" thì 1234 sẽ được trả về.

Ví dụ

Sử dụng mã của bạn (nhưng với phương pháp readPos được đề xuất) sau đó sử dụng như sau:-

    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

Kết quả là:-

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

tức là theo nhận xét test1-test3 trả về 0 không phải vì không tìm thấy hàng mà vì chuỗi được lưu trữ trong cột LAST_BTN không thể chuyển đổi thành số, vì vậy thay vì gặp sự cố, API SQLite sẽ chuyển đổi nó bằng 0 test4 được trích xuất và một giá trị khác 0 được trả về vì giá trị được lưu trữ trong LAST_BTN có thể được chuyển đổi (đại diện) thành một số. test5 không tồn tại trong cơ sở dữ liệu nên 0 được trả về vì không tìm thấy hàng.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Lưu kết quả truy vấn SQLite vào tệp văn bản

  2. lưu Danh sách <Model class> vào sqlite

  3. Truy vấn SQLite của Android trong đó cột không rỗng và không trống

  4. Cách hoạt động của SQLite Count ()

  5. Android Room - Cách đặt lại khóa chính của bảng được tạo tự động trên mỗi lần chạy ứng dụng