2013-04-18 12 views
5

में डालने पर कोई मौजूदा लेनदेन नहीं है मेरे एंड्रॉइड एप्लिकेशन में मुझे विभिन्न थ्रेड से कई SQLite तालिकाओं में डेटा डालना होगा (एक टेबल में सम्मिलन के लिए एक थ्रेड और 5 टेबल हैं)।ऑपरेशन निष्पादित नहीं कर सकता क्योंकि डेटाबेस

enter image description here

मैं का उपयोग करें: ->setTransactionSuccessful() - और हर धागे में>endTransaction(); सभी धागे एक साथ शुरू करते हैं, लेकिन दूसरे या कभी कभी तीसरे सूत्र में मैं हमेशा इस अपवाद मिला डेटा तो मैं का उपयोग beginTransaction() के एक बहुत हैं एकल SQLite कनेक्शन (सिंगलटन) mentioned here था लेकिन फिर भी यह समस्या बनी हुई है। इसलिए मुझे कुछ मदद की उम्मीद है। पहले से धन्यवाद!

पीएस और यदि मेरे पास दौड़ की स्थिति है तो मैं बहुप्रचारित प्रविष्टि के लिए किस तरह से उपयोग करना चाहिए?

उत्तर

4

मुझे लगता है कि आपकी समस्या दौड़ की स्थिति है। जब से तुम एक से अधिक थ्रेड कि शुरू करने और लेन-देन समाप्त कर रहे हैं है, तो आप निम्न कार्रवाई की तरह कुछ मिल सकता है:

beginTransaction() 
// this may be a noop because a transaction is already open 
beginTransaction() 
setTransactionSuccessful() 
setTransactionSuccessful() 
endTransaction() 
// this may throw because the previous end closes the transaction 
endTransaction() 

मुझे नहीं लगता कि SQLite अनेक लेन-देन एक भी कनेक्शन पर खुला समर्थन करता है और के रूप में आप का कहना है, एकाधिक कनेक्शन संभव नहीं है।

यदि लेनदेन का लक्ष्य डेटा को तेज़ करना है, तो आपको अपने आर्किटेक्चर को बदलना होगा और कई धागे से नहीं लिखना होगा। आप synchronized पर वास्तविक डेटाबेस अपडेट करने के लिए किसी प्रकार की उपयोगिता कक्षा का उपयोग कर सकते हैं, इसलिए सभी थ्रेड कॉल करते हैं और यह निर्णय लेता है कि लेनदेन को कब खोलना या बंद करना है। एक और विचार यह होगा कि एक ही धागा आपके डेटाबेस संचालन करे और अन्य सभी धागे BlockingQueue में लिखें जो लेखन धागे के साथ साझा किया गया है।

+0

मैंने अपने उत्तर @AlexanderKaraberov में कुछ विचार जोड़े हैं। – Gray

+0

एक कक्षा है (केवल एक डीएओ) जो कि वास्तविक डेटाबेस परिवर्तन करता है। फिर आपके धागे सिर्फ 'डालने()' या कुछ ऐसे कॉल करेंगे। विधि 'सिंक्रनाइज़' होगी और यह तय करेगा कि क्या मुझे लेनदेन शुरू करने की आवश्यकता है या नहीं, अगर यह पहले से शुरू नहीं हुआ था या लेनदेन समाप्त नहीं हुआ था। – Gray

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

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