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列に格納されている値が完全に数値ではない可能性があります。
- 行を一意に識別する値を取得する場合は、主キーIDとID列を返します。
また、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;
}
ただし、上記の変更では、LAST_BTN列に格納されている値が数値でない場合にreadPosが0を返すという問題は解決されません。 「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 行が見つからなかったためではなく、LAST_BTN列に格納された文字列を数値に変換できないため、0を返します。SQLiteAPIをクラッシュさせる代わりに、0を返します。 test4 LAST_BTNに格納されている値を数値に変換(表現)できるため、が抽出され、0以外の値が返されます。 test5 データベースに存在しないため、行が見つからなかったため0が返されます。