2011-12-31 18 views
8

मेरे पास एंड्रॉइड में एक SQLite डेटाबेस है और मैं ऑपरेशन को संभालने के लिए ContentProvider का उपयोग करता हूं, जो एक कॉलम में एक अद्वितीय क्वालीफायर वाली तालिका में बने रहते हैं।क्या SQLiteConstraint पर भरोसा करना ठीक है और SQLite को मेरे लिए जांच करने दें? क्या कोई पकड़ है?

समस्या:

हालांकि, जब मैं insert दोहराया मूल्यों डेटाबेस में, यह मेरी कोड से प्रति उल्लंघन नहीं करती है, लेकिन यह अभी भी SQLiteConstraintException लॉग लाइनों के हजारों थूक, और मेरे उपयोगकर्ता है कि बस लॉग को प्रदूषित करने जैसा लगता है, कुछ अप्रकाशित। मैंने प्रयोग करने के लिए अपवाद को पकड़ने की कोशिश की है, लेकिन यह अभी भी लॉग है।

प्रश्न:

तो, मैं चुप उन लॉग लाइनों करते हैं? क्या यह भी संभव है?

प्रश्न पूछने के कारण के लिए कृपया नीचे टिप्पणी पढ़ें।

त्रुटि:

समय स्तंभ UNIQUE बाधा है:

Error inserting Factor=2.0 Time=1325375465000 Extra=none 
android.database.sqlite.SQLiteConstraintException: error code 19: constraint failed 
    at android.database.sqlite.SQLiteStatement.native_execute(Native Method) 
    at android.database.sqlite.SQLiteStatement.execute(SQLiteStatement.java:55) 
    at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1549) 
    at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1410) 
    at mypackage.myapp.provider.DataProvider.bulkInsert(DataProvider.java:353) 
    at android.content.ContentProvider$Transport.bulkInsert(ContentProvider.java:179) 
    at android.content.ContentResolver.bulkInsert(ContentResolver.java:646) 
    at mypackage.myapp.service.MyService.onHandleIntent(MyService.java:96) 
    at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:59) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:123) 
    at android.os.HandlerThread.run(HandlerThread.java:60) 
+0

मैं महसूस कर रहा हूँ यह सब का मतलब है कि मैं क्या करने की कोशिश कर रहा हूँ एक अद्वितीय बाधा पर एक डुप्लिकेट डालने से उबरने के लिए एक आलसी तरीका है, इसलिए "unpolished" लॉग में लग रहा है। मैं शायद शुरू करने के लिए डुप्लीकेट प्रविष्टियों (और आवेषण बुलावा) जो भी बना रहा है बेहतर सुधार कर रहा हूँ। मैं सब चिकनीपन के लिए हूँ। लेकिन यह सवाल उठाता है (मेरे लिए): क्यों हम बाध्यता जांचकर्ता को सुरक्षित रूप से "ऑफ़लोड" नहीं कर सकते हैं और इसे चुपचाप लॉग-इन करने में विफल रहते हैं? बस अगर हम चाहते हैं ... शायद हम डुप्लिकेट की उम्मीद करते हैं ... इसलिए चिंता करने की कोई बात नहीं है। शायद हमारे डेटा स्रोत, हमारे नियंत्रण के बाहर से शुरू करने के लिए दोषपूर्ण है ... – davidcesarino

+0

उत्तर देने के बाद टिप्पणी: जैसा कि मैंने कहा था, मैं इस सवाल के प्रयोजनों के लिए उद्देश्य पर आलसी था, क्योंकि मैं चेक को कोड न करने की कोशिश कर रहा था और इसे 1) सुरक्षा (समरूपता), 2) दक्षता के बारे में सोचने के लिए छोड़ दें (2) दक्षता (उस पर मुझसे बेहतर/तेज है?) और 3) व्यावहारिक रूप से (कम कोड)। हालांकि, कुछ चीजें मेरे दिमाग (सम्मिलित पंक्ति गणना) पकड़ी गईं, इसलिए मैंने बाधाओं को बाधाओं के अलावा खुद को जांच लिया। वैसे भी, मैं (1) के बारे में अपने कोड से बहुत संतुष्ट हो गया। याद रखें कि इस सवाल को पढ़ते समय। – davidcesarino

+0

यदि आप android.util का उपयोग नहीं कर रहे हैं। अपने आप को लॉग इन करें, तो आप उपयोगकर्ता को त्रुटियों को लॉगिंग के बारे में क्यों चिंतित हैं? –

उत्तर

10

आप तैयार कर सकते हैं, तो या SQL खुद को संशोधित, या तो INSERT के लिए या प्रारंभिक CREATE TABLE के लिए, आप उपयोग कर सकते हैं SQLite का conflict handling extensions

  • जब आप डालें, INSERT OR IGNORE बजाय INSERT का उपयोग: वहाँ ऐसा करने के तरीके के लिए दो विकल्प हैं। आप OR REPLACE, OR ABORT, या कई अन्य प्रतिक्रियाओं का भी उपयोग कर सकते हैं।
  • जब आप तालिका बनाते हैं, तो UNIQUE बाधा के लिए ON CONFLICT IGNORE खंड निर्दिष्ट करें। इससे आवेषण या अपडेट आएंगे जो चुपचाप कुछ भी करने के लिए बाधा का उल्लंघन नहीं करते हैं।

मैं INSERT OR IGNORE/INSERT OR REPLACE का उपयोग कर डुप्लिकेट डेटा, विशेष रूप से समवर्ती वातावरण में संभाल करने के लिए, बहुत साफ होने के लिए के विचार हैं। यह एक बार डुप्लिकेशन के लिए जांचता है - डेटाबेस में - और दौड़ की स्थितियों से बचाता है जहां आप पहले अस्तित्व की जांच करते हैं (स्वीकार्य रूप से कोई समस्या नहीं है यदि केवल एक प्रक्रिया/धागा डेटाबेस तक पहुंच रहा हो)।

हालांकि, यदि डुप्लिकेट एक बग का परिणाम होता है (डुप्लिकेट ईवेंट/क्रियाओं के बजाय जो आपका कोड स्पष्ट रूप से डी-डुप्लिकेटिंग नहीं है), तो यह बस इसे ठीक करने के बजाय बग को छुपा सकता है। स्पष्ट डी-ड्यूलिकेशन की कमी, हालांकि, मेरी राय में एक बग नहीं है। तो अगर फिक्स डुप्लिकेट की जांच करना है, तो डेटाबेस का उपयोग करें; यदि वास्तविक समस्या यह है कि वे पहले स्थान पर उत्पन्न हुए थे (वास्तविक अनुप्रयोग स्तर पर, डेटाबेस पंक्ति स्तर नहीं), तो शायद मैं उस समस्या की तलाश करूंगा।

+2

धन्यवाद, यह वही है जो मुझे दिमाग में था। मैंने यह भी देखा कि यदि मैं तालिका स्कीमा पर 'ऑन कॉन्फ्लिक्ट इग्नोर' का उपयोग करता हूं, तो एंड्रॉइड के 'SQLiteDatabase.insert (स्ट्रिंग, स्ट्रिंग, कंटेंटवेल्यूज' 'पंक्ति के रूप में पंक्ति की रिपोर्ट करेगा ... इसलिए यदि आपको इसकी आवश्यकता हो तो सावधान रहें। और हां, इस बात पर विचार करते हुए कि मेरे पास कई सेवाएं डाउनलोड करने वाली सेवाएं हैं, इसलिए उन्हें दौड़ की स्थिति से बचने का लाभ भी है। धन्यवाद। – davidcesarino

1

हाँ आप इसे छोड़ सकते हैं और जैसा कि आप कहते हैं कि आप इसे ठीक कर सकते हैं। मेरी राय में यह निर्भर करता है कि क्या डुप्लिक असाधारण अवसर हैं या 'बस ऐसा इसलिए होता है क्योंकि आप आलसी हैं'।

मुझे लगता है कि मुख्य रूप से इसके बाद इसे निपटने के बजाय मॉड्यूल में प्रवेश पर डेटा को साफ करने के लिए कम लागत होती है। हालांकि आप कैसे परिभाषित करते हैं कि लागत आपके लिए नीचे है।

+0

अधिकांश डुप्लिकेट नहीं हैं, लेकिन उनमें से कुछ सेवा डाउनलोडर को ट्रिगर करने से पहले मेरे द्वारा तय किए जा सकते हैं। मैं प्रवेश बिंदु पर जांच के बारे में सहमत हूं। हालांकि, मैं कोड को खत्म करने से बहुत दूर हूं, और मैं इसे "क्या-अगर" परिप्रेक्ष्य में भी पूछ रहा था। – davidcesarino