SQLite त्रुटि में एकाधिक पंक्तियाँ सम्मिलित करें
मुझे वास्तव में आपका दृष्टिकोण पसंद नहीं है। यह बहुत हार्डकोर है और यह स्पेगेटी कोड जैसा दिखता है। और आपका दृष्टिकोण कभी काम नहीं करेगा क्योंकि एक प्रविष्टि में केवल एक मान हो सकता है . तो आप इसे गलत कर रहे हैं। API insert()
का उपयोग करने के बारे में क्या? विधि है कि इसे सीधे सम्मिलित करने के लिए डिज़ाइन किया गया है?
गति प्रदर्शन और सुरक्षा के दृष्टिकोण से भी मैं आपको TRANSACTION
. का उपयोग करने की सलाह देता हूं भी। लेकिन चलिए विशेष रूप से आपके लिए कुछ कोड लिखते हैं।
public void insertMultiple(List<Contact> contacts) {
Contact c = null;
ContentValues values = new ContentValues();
try {
if (db != null) {
db.beginTransaction();
for (Contact c: contacts) {
values.put(SQLConstants.FIRSTNAME, c.getFirstName());
values.put(SQLConstants.LASTNAME, c.getLastName());
...
db.insertOrThrow("Contacts", SQLConstants.FIRSTNAME, values);
values.clear();
}
db.setTransactionSuccessful();
}
}
finally {
if (db != null && db.inTransaction()) {
db.endTransaction();
}
}
}
नोट:
जैसा कि मैंने देखा कि आपके पास Constacts . नामक तालिका है इसलिए मेरा सुझाव है कि आप स्वयं का ऑब्जेक्ट संपर्क बनाएं यह एप्लिकेशन लेयर पर आपकी तालिका का प्रतिनिधित्व करेगा जहां ऑब्जेक्ट के गुण तालिका में कॉलम के बराबर हैं। मैं आपको इस दृष्टिकोण का उपयोग करने की सलाह देता हूं क्योंकि:
- यह स्पेगेटी कोड नहीं है
- यह बहुत तेज़ है
- यह कहीं अधिक सुरक्षित है
अंत में कुछ सुझाव:
execSQL()
बुरा नहीं है, लेकिन मैं इसे आम तौर पर केवल तभी उपयोग कर रहा हूं जब मैं SQLiteOpenHelper
बनाता हूं टेबल बनाने और हटाने और बदलने के लिए उपवर्ग। वहां एक प्रयोग काफी उपयुक्त है। लेकिन आपके लिए मुख्य अनुशंसाएं हैं:
- हर बार जब आप लेन-देन के उपयोग को सम्मिलित करते हैं, अपडेट करते हैं, हटाना हमेशा बहुत अच्छा अभ्यास होता है, क्योंकि गति के प्रदर्शन में वृद्धि को छोड़कर (विशेषकर यदि आप बड़ी संख्या में पंक्तियों को सम्मिलित करते हैं) डेटाबेस के साथ आपके कार्य अधिक सुरक्षित हैं।
केवल जानकारी के लिए: जब मैंने SQLite में 1000, 10 000, 100 000 पंक्तियाँ डालीं तो मैंने कुछ परीक्षण किए और मैं आपको बता सकता हूँ कि 100 000 पंक्तियों को सम्मिलित करने में केवल 55,346 लगा। सेकंड। लेन-देन के बिना 1 000 पंक्तियों को सम्मिलित करने में 73,398 . भी लगा सेकंड।उप>
- हर बार जब आप एक या अधिक तालिकाओं का चयन कर रहे हों, सम्मिलित कर रहे हों, अपडेट कर रहे हों तो प्लेसहोल्डर का उपयोग करें यानी पैरामीट्रिज्ड स्टेटमेंट और हार्डकोडेड नहीं। इसके साथ, आपके प्रश्न सुरक्षित, तेज और बेहतर मानव-पठनीय हो जाएंगे। ज्वाइनिंग के मामले में हमेशा जॉइन क्लॉज का इस्तेमाल करें। यह सबसे अच्छा है जिसे आप चुन सकते हैं।
अपडेट करें:
यहां आपका कोड काम कर रहा है:
insert into Contacts(ID, FirstName, LastName, PhoneNumber, EmailId, Status)
select 'someId' as ID, 'xxx' as FirstName, 'xxx' as LastName , '9008987887' as PhoneNumber , '[email protected]' as EmaiId, 'Yes' as Status
union all select 'someId', 'xxx', 'xxx', '9008987887', '[email protected]', 'Yes'
union all select 'someId', 'xxx', 'xxx', '9008987887', '[email protected]', 'Yes'
अपडेट 2:
जैसा कि @Korniltsev अनातोली ने SQLite में बताया है कि एक बाधा है SQLITE_MAX_COMPOUND_SELECT
इसका मतलब है कि आप एक बार में 500 से अधिक यूनियनों का उपयोग नहीं कर सकते।