Dalam readPos
metode, bukan :-
Cursor cursor = db.rawQuery("SELECT " + LAST_BTN + " FROM "
+TABLE_NAME+" WHERE " + _ID +" =? " });
Anda harus memiliki :-
Cursor cursor = db.rawQuery("SELECT " + LAST_BTN + " FROM "
+TABLE_NAME+" WHERE " + _ID +" =? ",new String[]{_id});
Kode di atas berfungsi dengan baik sebelum perubahan. Sekarang updatePos memberikan nilai yang benar tetapi readPos selalu mengembalikan nol ....
Menggunakan cursor.getInt(cursor.getColumnIndex(LAST_BTN))
akan, kecuali nilai di kolom LAST_BTN adalah numerik, mengembalikan 0 (tidak dapat mengubah string menjadi angka sehingga mengembalikan 0). Dari uraian Anda tentang masalah tersebut, tampaknya nilai yang disimpan di kolom LAST_BTN tidak sepenuhnya numerik.
- Jika Anda ingin mendapatkan nilai yang secara unik mengidentifikasi baris, kembalikan id kunci utama ke kolom id.
Anda juga tidak perlu meneruskan last_btn ke readPos
metode, jadi bisa menggunakan public int readPos(String _id)
alih-alih public int readPos(String _id, int last_btn)
.
Selain itu, Anda membiarkan kursor terbuka, terlalu banyak kursor terbuka dan Aplikasi akan macet. Saya sarankan mempertimbangkan hal berikut:-
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;
}
Namun, perubahan di atas TIDAK AKAN menyelesaikan masalah bahwa readPos akan mengembalikan 0 jika nilai yang disimpan di kolom LAST_BTN non-numerik mis. jika "A1234" maka hasilnya adalah 0, jika "1234" maka 1234 akan dikembalikan.
Contoh
Gunakan kode Anda (tetapi dengan metode readPos yang disarankan) lalu gunakan yang berikut:-
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
Hasil dalam :-
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
yaitu sesuai dengan komentar test1-test3 kembalikan 0 bukan karena baris tidak ditemukan tetapi karena string yang disimpan di kolom LAST_BTN tidak dapat dikonversi ke angka, jadi alih-alih mogok, API SQLite mengonversinya menjadi 0. test4 diekstraksi dan nilai bukan 0 dikembalikan karena nilai yang disimpan di LAST_BTN dapat dikonversi (mewakili) ke angka. tes5 tidak ada dalam database sehingga 0 dikembalikan karena baris tidak ditemukan.