SQLite
 sql >> डेटाबेस >  >> RDS >> SQLite

एंड्रॉइड में ठीक से स्क्लाइट डीबी सेट करें

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 लौटा दिया जाता है क्योंकि पंक्ति नहीं मिली थी।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. मैं ग्रिड व्यू में एकाधिक छवि सेट करने में सक्षम नहीं हूं?

  2. संपत्ति फ़ोल्डर में डीबी के साथ ListView को कैसे पॉप्युलेट करें?

  3. SQLite मैक्स () कैसे काम करता है

  4. SQLite MAX

  5. एंड्रॉइड - टेक्स्ट व्यू में लॉगिन करने के बाद एसक्लाइट डेटाबेस से उपयोगकर्ता नाम प्रदर्शित करें