मेरा मानना है कि आप पूछ रहे हैं कि नई पंक्तियां कैसे डालें या अपनी मौजूदा पंक्तियों को कैसे अपडेट करें एक चरण में। हालांकि यह एक कच्चे एसक्यूएल में संभव है जैसा कि इस उत्तर में चर्चा की गई है, मैंने पाया कि संघर्ष एल्गोरिदम के लिए 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 बनाएगा।