पर this document का उल्लेख करता है मुझे विश्वास है कि आप कैसे करने के लिए सम्मिलित करें नई पंक्तियाँ पूछ या अपने मौजूदा पंक्तियों एक कदम में अद्यतन कर रहे हैं। हालांकि यह एक भी कच्चे एसक्यूएल के रूप में this answer में चर्चा में संभव है, मैंने पाया यह आसान conflictAlgorithm के लिए 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 = पंक्ति है कि "VALUE अरब")। यहाँ CONFLICT_REPLACE और CONFLICT_IGNORE साथ insertWithOnConflict का उपयोग कर
- CONFLICT_REPLACE दूसरे कॉलम के मौजूदा मूल्यों के ऊपर लिख देगा शून्य पर (यानी। ColumnB शून्य हो जाएगा और परिणाम _ id हो जाएगा = 1, Columna = "valueNEW" अंतर है, columnB = शून्य)। परिणामस्वरूप आप मौजूदा डेटा खो देते हैं और मैं इसे अपने कोड में उपयोग नहीं करता हूं।
- CONFLICT_IGNORE आपकी मौजूदा पंक्ति # 1 के लिए SQL INSERT को छोड़ देगा और आप SQL को अन्य सभी कॉलम की सामग्री को संरक्षित करने के अगले चरण में इस पंक्ति को अद्यतन करेंगे (यानी परिणाम _id = 1, columnA = "valueNEW" होगा, कॉलम बी = "वैल्यूबी")।
जब आप डालने के लिए नई पंक्ति # 2 जो अभी मौजूद नहीं है प्रयास करते हैं, कोड केवल पहले बयान insertWithOnConflict में एसक्यूएल सम्मिलित करें निष्पादित करेंगे (यानी। परिणाम _ id हो जाएगा = 2, Columna = "valueA" , कॉलम बी = न्यूल)।
this bug से सावधान रहें जो SQLiteDatabase.CONFLICT_IGNORE को API10 (और शायद API11) पर खराब होने का कारण बन रहा है। जब मैं एंड्रॉइड 2.2 पर परीक्षण करता हूं तो क्वेरी -1 के बजाय 0 लौट रही है।
आप रिकॉर्ड कुंजी _ id पता नहीं है या आप एक शर्त है कि एक संघर्ष नहीं बनाएगा है, तो आप तर्क को अपडेट करने या INSERT को उल्टा कर सकते हैं। यह UPDATE के दौरान आपकी रिकॉर्ड कुंजी _id रखेगा या INSERT के दौरान एक नया रिकॉर्ड _id बनाएगा।
int u = yourdb.update("yourtable", values, "anotherID=?", new String[]{"x"});
if (u == 0) {
yourdb.insertWithOnConflict("yourtable", null, values, SQLiteDatabase.CONFLICT_REPLACE);
}
उपरोक्त उदाहरण मानता है कि आपके सिर्फ उदाहरण के लिए रिकॉर्ड में टाइमस्टैम्प मूल्य अपडेट करना चाहते हैं। यदि आप पहले डालें WithOnConflict को कॉल करते हैं, तो टाइमस्टैम्प स्थिति में अंतर के कारण INSERT नया रिकॉर्ड _id बनाएगा।
आप किसी विशेष पंक्ति .. पूर्व पर अद्यतन कह सकते हैं। ___ अपडेट करें जहां rowId = 4 .. और यदि अद्यतन 0 देता है .. आपको पता है कि आपके पास वह पंक्ति नहीं है, तो बस इसे डालें। – dymmeh