2012-07-04 17 views
7

में नजरअंदाज कर दिया है मैं निम्नलिखित बनाने के बयान के साथ एक सरल पता तालिका है:एंड्रॉयड sqlLite संघर्ष पर ध्यान न दें आईसीएस

"CREATE TABLE " + ADDRESSES_TABLE + " (" + 
       KEY_ADDRESS_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + 
       KEY_ADDRESS_COUNTRY + " TEXT, " + 
       KEY_ADDRESS_CITY + " TEXT, " + 
       KEY_ADDRESS_STREET + " TEXT, " + 
       KEY_ADDRESS_HOUSE + " TEXT, " + 
       KEY_ADDRESS_POSTAL_CODE + " TEXT," + 
       "UNIQUE("+KEY_ADDRESS_COUNTRY+","+KEY_ADDRESS_CITY+","+KEY_ADDRESS_STREET+","+KEY_ADDRESS_HOUSE+","+KEY_ADDRESS_POSTAL_CODE +") ON CONFLICT IGNORE)" 

जब मैं डुप्लिकेट रिकॉर्ड जोड़ने के लिए, सम्मिलित करें() metod रिटर्न -1 और नहीं की आईडी मौजूदा पंक्ति

समस्या केवल 4.0+ पर पुन: उत्पन्न होती है। विधि 2.2 और 2.3.3 पर अपेक्षित के रूप में काम करती है।

किसी को भी एक ही मुद्दे का सामना करना पड़ा है?

+0

क्या आप 'insert' या 'insertWithOnConflict' का उपयोग कर रहे हैं? – Barak

+0

मैंने दोनों की कोशिश की, लेकिन मुझे लगता है कि अगर मैं टेबल निर्माण में कॉन्फ्लिक्ट इग्नोर पर निर्दिष्ट करता हूं तो InsintWithOnConflict समझ में नहीं आता है। – Zzokk

उत्तर

9

दुर्भाग्यवश, एंड्रॉइड दस्तावेज़ गलत है। (और इस तरह अपने कोड वास्तव में एंड्रॉयड, जैसे, 2.2 और 2.3 के पूर्व संस्करण पर अपेक्षा के अनुरूप काम नहीं करता है।)

2,2 और 2.3 में, insertWithOnConflict() SQLite सी एपीआई समारोह sqlite3_last_insert_rowid() का मूल्य, जिसका प्रलेखन स्पष्ट रूप से वापस आ जाएगी वह विफल आवेषण (उदाहरण के लिए, जहां ऑन कॉन्फ्लिक्ट रिज़ॉल्यूशन, जैसे IGNORE लागू होता है) वापसी मान को प्रभावित नहीं करते हैं। इस प्रकार, यदि कनेक्शन के लिए कोई पूर्व सम्मिलित नहीं किया गया था और डुप्लिकेट डालने का प्रयास किया गया है, तो insertWithOnConflict() वापस आ जाएगा। यदि किसी पूर्व तालिका में किसी भी पंक्ति में कोई पंक्ति डाली जाती है, तो विधि की पंक्ति आईडी वापस कर देगी जो डालने --- बेशक यह काफी गलत है।

4.0 में, insertWithOnConflict() ही SQLite सी एपीआई फंक्शन का मान वापस आ जाएगी, लौटने को छोड़कर -1 0.

के बजाय यह परिवर्तन यही वजह है कि अब आप त्रुटि देख रहे हैं। लेकिन यदि आप परिणाम 2.2 और 2.3 में बारीकी से देखते हैं, तो आप देखेंगे कि OR IGNORE क्लॉज का उपयोग किया जाने पर पंक्ति आईडी वापस आती है, वास्तव में सही पंक्ति आईडी नहीं होती है (संयोग से छोड़कर)।

+0

यदि यह वास्तव में सही व्यवहार है, तो आपको इसे एक बग के रूप में सबमिट करना चाहिए [http://source.android.com/source/report-bugs.html) ... चोट नहीं पहुंचा सकता: डी –

+1

यह वहां है अंक 13045 के रूप में: स्पष्टीकरण के लिए https://code.google.com/p/android/issues/detail?id=13045 –

+1

धन्यवाद। मैं वास्तव में इस विधि पर भरोसा किया। तो सबसे अच्छा समाधान नहीं है: कोशिश { insertOrThrow (/ * सभी आवश्यक पैरामीटर * /) } पकड़ (SQLException ई) { // आवश्यक रिकॉर्ड का चयन करें और से यह प्राथमिक कुंजी प्राप्त} नहीं है यह समय के मामले में डीबी के लिए बहुत भारी? – Zzokk

संबंधित मुद्दे