2011-03-09 14 views
22

मेरे पास एक ऐसा एप्लिकेशन है जिसमें 2 भाग हैं।डेटाबेस 2 प्रक्रियाओं के साथ हैंडलिंग

  • एक सेवा जो सामग्री बनाती है। सामग्री

इनमें से प्रत्येक के रूप में विभिन्न प्रक्रियाओं को चलाने का उपयोग करता है

  • एक अनुप्रयोग। समस्या यह है कि उनमें से दोनों डेटाबेस साझा करते हैं। और जब मैं सेवा लिखने की कोशिश करता है और यूआई डेटा पढ़ रहा है, तो मुझे अक्सर डेटाबेस लॉक त्रुटि मिलती है। इसके विपरीत इसके विपरीत। इस बारे में कैसे जाते हैं?

    • डीबी तक पहुंचने के लिए उपयोग की जाने वाली कक्षा एक सिंगलटन कक्षा है। लेकिन चूंकि दोनों UI & सेवा 2 अलग-अलग प्रक्रियाएं हैं, इसलिए मुझे लगता है कि 2 सिंगलेट हैं। तो यह मदद नहीं करता है।
    • यहां तक ​​कि synchronise मुझे लगता है कि दो अलग-अलग प्रक्रियाओं के कारण से मुझे लगता है।
    • Content Providers शायद एक विकल्प है, लेकिन चूंकि मैं जानकारी खोदने के लिए जटिल प्रश्नों का उपयोग करता हूं, इसलिए इसका उपयोग करना भी मुश्किल होगा।

    मैं दो प्रक्रियाओं को डेटाबेस साझा कैसे करूं। किसी भी संकेत की सराहना की जाएगी।

  • +0

    क्या आप मुझे मार्गदर्शन कर सकते हैं कि बर्कले डीबी का उपयोग कैसे करें। – Kishore

    उत्तर

    7

    सामग्री प्रदाता का उपयोग करना एक विकल्प है। एक और Berkeley DB पर एक नज़र डालना है। बीडीबी SQL API SQLite संगत है और बीडीबी लॉक मैनेजर कई धागे और/या प्रक्रियाओं को डेटाबेस को समवर्ती रूप से पढ़ने/लिखने की अनुमति देता है।

    +0

    दिलचस्प लगता है। मैं इस पर कुछ जानकारी खोद रहा हूं। बीडीबी और बीडीबी एसक्यूएल के 2 विकल्प हैं, और मैं स्पष्ट रूप से बाद में रुचि रखता हूं। लेकिन ऐसा लगता है कि हमें स्रोत बनाने और एसक्यूएल संस्करण के लिए रॉम फ्लैश करने की आवश्यकता है? – Codevalley

    +0

    ओटीएन मंच शुरू करने के लिए एक अच्छी जगह है: http://bit.ly/eIREhr हां, मुझे विश्वास है कि आपको स्रोत बनाने की आवश्यकता होगी। मैंने किसी को ओटीएन मंच पर आपके प्रश्न पर अनुवर्ती करने के लिए कहा है। – dsegleau

    +0

    यह लिंक भी शुरू करने के लिए एक अच्छी जगह है: http://bit.ly/hb7wlC – dsegleau

    0

    निम्नलिखित Android पर SQLite के साथ काम करता है पर ताला लगा है और क्या चीजों के बारे में पता होना करने के लिए पर एक बड़ा लेख है: http://kagii.squarespace.com/journal/2010/9/10/android-sqlite-locking.html

    मैं आपको कुछ जवाब वहाँ मिल जाएगा :)

    +1

    मेरा मुद्दा अलग है। मेरे पास 2 प्रक्रियाएं हैं (2 अनुप्रयोग के बराबर) एक ही डेटाबेस तक पहुंचने का प्रयास कर रही है और यह एक-दूसरे को ताला लगा देती है। – Codevalley

    3

    कनेक्शन बंद लगता होगा प्रत्येक ऑपरेशन

    पकड़ डेटाबेस बंद कर दिया त्रुटि और बाद के बाद 50ms

    फिर से कनेक्ट करने के लिए या जाने सेवा संभाल डेटाबेस और गतिविधि डेटा के लिए सेवा पूछने की कोशिश

    क्या हैडेटाइनइनUUMMethod है?

    +0

    ठीक है, सुनिश्चित करें कि मेरे ज्ञान में कोई 'isDatabaseInUse' या समान नहीं है। और चूंकि सेवा और गतिविधि अलग-अलग प्रक्रियाएं हैं, इसलिए उनके बीच प्रक्रिया कॉल आसान नहीं है। – Codevalley

    +3

    हां लेकिन आप अभी भी अपवाद पकड़ सकते हैं और क्वेरी दोहरा सकते हैं। इसके आस-पास एक वक्तव्य बयान दें। जैसे ही दूसरी प्रक्रिया इसके कनेक्शन को बंद कर देती है, इसे निष्पादित किया जाएगा। दोनों में एक ही चीज़ बनाएं और वे – sherif

    +0

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

    1

    आपको एक स्रोत प्रदाता का उपयोग एक स्रोत के माध्यम से अपने डेटाबेस प्रश्नों को फ़नल करने के लिए करना चाहिए। सामग्री प्रदाता के अंदर आप किसी भी लॉकिंग तंत्र का उपयोग कर सकते हैं, जिसे आप सुनिश्चित करना चाहते हैं कि आपके पास समवर्ती पहुंच नहीं है। आप डेटाबेस पर्यवेक्षकों का उपयोग डेटाबेस में परिवर्तनों के साथ सेवा क्रियाओं को समन्वयित करने के बारे में भी सोच सकते हैं।

    +0

    मैंने उन पंक्तियों पर खुदाई की। 'ContentProviders' पर एक नमूना ऐप नहीं मिला। इसके अलावा, क्या हम इसे 'ContentObservers' के बिना उपयोग कर सकते हैं? – Codevalley

    +0

    हां, आप इसे contentobservers के बिना उपयोग कर सकते हैं। पर्यवेक्षक केवल परिवर्तनों पर अधिसूचना करते हैं, लेकिन आपको उन्हें मैन्युअल रूप से ट्रिगर करना होगा, ताकि आप उन्हें अनदेखा कर सकें। –

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