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

Android SQLite सम्मिलित करें या अपडेट करें

मेरा मानना ​​है कि आप पूछ रहे हैं कि नई पंक्तियां कैसे डालें या अपनी मौजूदा पंक्तियों को कैसे अपडेट करें एक चरण में। हालांकि यह एक कच्चे एसक्यूएल में संभव है जैसा कि इस उत्तर में चर्चा की गई है, मैंने पाया कि संघर्ष एल्गोरिदम के लिए CONFLICT_IGNORE का उपयोग करके SQLiteDatabase.insertWithOnConflict() का उपयोग करके एंड्रॉइड में दो चरणों में ऐसा करना आसान है।

ContentValues initialValues = new ContentValues();
initialValues.put("_id", 1); // the execution is different if _id is 2
initialValues.put("columnA", "valueNEW");

int id = (int) yourdb.insertWithOnConflict("your_table", null, initialValues, SQLiteDatabase.CONFLICT_IGNORE);
if (id == -1) {
    yourdb.update("your_table", initialValues, "_id=?", new String[] {"1"});  // number 1 is the _id here, update to variable for your code
}

यह उदाहरण मानता है कि तालिका कुंजी कॉलम "_id" के लिए सेट है, कि आप रिकॉर्ड _id जानते हैं, और यह कि पहले से ही पंक्ति #1 (_id=1, columnA ="valueA", columnB ="valueB") है। CONFLICT_REPLACE और CONFLICT_IGNORE

के साथ insertWithOnConflict का उपयोग करने में अंतर यहां दिया गया है
  • CONFLICT_REPLACE अन्य स्तंभों में मौजूदा मानों को शून्य में अधिलेखित कर देगा (अर्थात कॉलमB NULL हो जाएगा और परिणाम _id=1, columnA ="valueNEW", columnB =NULL) होगा। परिणामस्वरूप आप मौजूदा डेटा खो देते हैं और मैं इसे अपने कोड में उपयोग नहीं करता।
  • CONFLICT_IGNORE आपकी मौजूदा पंक्ति #1 के लिए SQL INSERT को छोड़ देगा और आप अगले चरण में अन्य सभी स्तंभों की सामग्री को संरक्षित करते हुए इस पंक्ति को SQL अद्यतन करेंगे (अर्थात परिणाम _id=1, columnA ="valueNEW" होगा, कॉलमबी ="वैल्यूबी")।

जब आप नई पंक्ति #2 डालने का प्रयास करते हैं जो अभी तक मौजूद नहीं है, तो कोड केवल पहले कथन में SQL INSERT निष्पादित करेगा insertWithOnConflict (यानी परिणाम _id =2 होगा, कॉलम ए ="वैल्यून्यू", कॉलमबी =न्यूल)।

इस बग से सावधान रहें जो SQLiteDatabase.CONFLICT_IGNORE को API10 (और शायद API11) पर खराबी का कारण बना रहा है। जब मैं एंड्रॉइड 2.2 पर परीक्षण करता हूं तो क्वेरी -1 के बजाय 0 लौट रही है।

यदि आप रिकॉर्ड कुंजी _id नहीं जानते हैं या आपके पास ऐसी स्थिति है जो कोई विरोध पैदा नहीं करेगी, तो आप तर्क को UPDATE या INSERT में उलट कर कर सकते हैं . यह अद्यतन के दौरान आपकी रिकॉर्ड कुंजी _id रखेगा या INSERT के दौरान एक नया रिकॉर्ड _id बनाएगा।

int u = yourdb.update("yourtable", values, "anotherID=?", new String[]{"x"});
if (u == 0) {
    yourdb.insertWithOnConflict("yourtable", null, values, SQLiteDatabase.CONFLICT_REPLACE);
}

उपरोक्त उदाहरण मानता है कि आप उदाहरण के लिए रिकॉर्ड में टाइमस्टैम्प मान को अपडेट करना चाहते हैं। यदि आप पहले insertWithOnConflict को कॉल करते हैं, तो INSERT टाइमस्टैम्प स्थिति में अंतर के कारण नया रिकॉर्ड _id बनाएगा।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQLite Strftime () फ़ंक्शन के लिए मान्य प्रारूप स्ट्रिंग प्रतिस्थापन

  2. NullPointerException getReadableDatabase पर ()

  3. गतिविधि और पृष्ठभूमि सेवा SQLite डेटाबेस तक पहुंच

  4. एक ऑफ़लाइन-प्रथम देशी Android ऐप कैसे विकसित करें

  5. वर्डनेट एसक्लाइट समानार्थक शब्द और नमूने