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;
}
हालांकि, उपरोक्त परिवर्तन इस समस्या का समाधान नहीं करेंगे कि यदि LAST_BTN कॉलम में संग्रहीत मान गैर-संख्यात्मक है, तो readPos 0 वापस आ जाएगा। यदि यह "A1234" है तो परिणाम 0 होगा, यदि यह "1234" है तो 1234 वापस कर दिया जाएगा।
उदाहरण
अपने कोड का उपयोग करना (लेकिन सुझाई गई रीडपोस विधि के साथ) फिर निम्नलिखित का उपयोग करना:-
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 कॉलम में संग्रहीत स्ट्रिंग को किसी संख्या में परिवर्तित नहीं किया जा सकता है, इसलिए SQLite API को क्रैश करने के बजाय इसे 0 में परिवर्तित करता है। test4 निकाला जाता है और एक गैर 0 मान वापस कर दिया जाता है क्योंकि LAST_BTN में संग्रहीत मान को एक संख्या में परिवर्तित (प्रतिनिधित्व) किया जा सकता है। परीक्षण5 डेटाबेस में मौजूद नहीं है इसलिए 0 लौटा दिया जाता है क्योंकि पंक्ति नहीं मिली थी।