2012-10-30 7 views
6

मैंने इस त्रुटि संदेश के बारे में बहुत से विषय पढ़े हैं लेकिन मैं अपनी समस्या का समाधान नहीं कर सकता।एंड्रॉइड: java.lang.IllegalStateException: डेटाबेस xxx.db (conn # 0) पहले से ही

मेरे पास Google play पर एक ऐप है और मुझे उपयोगकर्ताओं से कुछ त्रुटि रिपोर्ट मिलती हैं। जब मैं ऐप की कोशिश कर रहा हूं, तो सब ठीक काम करता है।

एप्लिकेशन में, मैं 30 टेबल जैसे कुछ के साथ एक बड़ा डेटाबेस प्रबंधित कर रहा हूं। मैं Destroy() पर अपनी मुख्य गतिविधि में डेटाबेस बंद कर रहा हूं और क्वेरी समाप्त होने पर सभी कर्सर बंद हैं।

मुझे सच में नहीं पता कि समय-समय पर उपयोगकर्ताओं को यह त्रुटि संदेश क्यों मिल रहा है।

java.lang.IllegalStateException: database /data/data/mdpi.android/databases/LocalDatabase.db (conn# 0) already closed 
at android.database.sqlite.SQLiteDatabase.verifyDbIsOpen(SQLiteDatabase.java:2213) 
at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1565) 
at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1525) 
at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1605) 
at mdpi.android.database.LocalDatabase.getHistoryLastSuccessfullUpdate(LocalDatabase.java:661) 
at mdpi.android.Journals$7.onItemClick(Journals.java:723) 
at android.widget.AdapterView.performItemClick(AdapterView.java:292) 
at android.widget.Gallery.onSingleTapUp(Gallery.java:960) 
at android.view.GestureDetector.onTouchEvent(GestureDetector.java:1310) 
at android.widget.Gallery.onTouchEvent(Gallery.java:937) 
at android.view.View.dispatchTouchEvent(View.java:5724) 
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1964) 
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1725) 
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1970) 
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1739) 
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1970) 
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1739) 
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1970) 
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1739) 
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1970) 
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1739) 
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1970) 
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1739) 
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1970) 
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1739) 
at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2071) 
at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1405) 
at android.app.Activity.dispatchTouchEvent(Activity.java:2426) 
at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2019) 
at android.view.View.dispatchPointerEvent(View.java:5904) 
at android.view.ViewRootImpl.deliverPointerEvent(ViewRootImpl.java:3155) 
at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2670) 
at android.view.ViewRootImpl.processInputEvents(ViewRootImpl.java:1000) 
at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2679) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:137) 
at android.app.ActivityThread.main(ActivityThread.java:4517) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:511) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:993) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:760) 
at dalvik.system.NativeStart.main(Native Method) 

और एक और एक:

java.lang.RuntimeException: Unable to start activity ComponentInfo{mdpi.android/mdpi.android.UserInformations}: java.lang.IllegalStateException: database /data/data/mdpi.android/databases/LocalDatabase.db (conn# 0) already closed 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2202) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2237) 
at android.app.ActivityThread.access$600(ActivityThread.java:139) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1262) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:154) 
at android.app.ActivityThread.main(ActivityThread.java:4974) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:511) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
at dalvik.system.NativeStart.main(Native Method) 
Caused by: java.lang.IllegalStateException: database /data/data/mdpi.android/databases/LocalDatabase.db (conn# 0) already closed 
at android.database.sqlite.SQLiteDatabase.verifyDbIsOpen(SQLiteDatabase.java:2194) 
at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1536) 
at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1496) 
at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1576) 
at mdpi.android.database.LocalDatabase.getUserInformations(LocalDatabase.java:357) 
at mdpi.android.UserInformations.onCreate(UserInformations.java:122) 
at android.app.Activity.performCreate(Activity.java:4538) 
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1071) 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2158) 
... 11 more 

संपादित करें: एक नए त्रुटि

यहाँ पूरे त्रुटि लॉग है। - इस वर्ग के अलग धागे से देशी SQLite के लिए उपयोग सिंक्रनाइज़ करने के लिए ख्याल रखता है

java.lang.RuntimeException: An error occured while executing doInBackground() 

at android.os.AsyncTask$3.done(AsyncTask.java:278) 
at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273) 
at java.util.concurrent.FutureTask.setException(FutureTask.java:124) 
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307) 
at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
at java.lang.Thread.run(Thread.java:856) 
Caused by: java.lang.NullPointerException 
at android.database.sqlite.SQLiteStatement.releaseAndUnlock(SQLiteStatement.java:290) 
at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:115) 
at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1718) 
at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1591) 
at mdpi.android.database.LocalDatabase.insertCountry(LocalDatabase.java:143) 
at mdpi.android.database.CountryTable.EnterCountry(CountryTable.java:21) 
at mdpi.android.UserInformations$insertCountryAsync.doInBackground(UserInformations.java:270) 
at mdpi.android.UserInformations$insertCountryAsync.doInBackground(UserInformations.java:1) 
at android.os.AsyncTask$2.call(AsyncTask.java:264) 
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
... 4 more 
+0

बस एक यद्यपि। ऑनस्ट्रोय() का विवरण अस्पष्ट है। तो एक धारणा है कि इसे कुछ गैर-स्पष्ट परिस्थितियों में नहीं कहा जा सकता है। उदाहरण के लिए, इस उत्तर में _comments_ देखें: http://stackoverflow.com/a/9409517/1665128। इसलिए, यदि आप समस्या को पुन: उत्पन्न नहीं कर सकते हैं, तो डीबी चीजों को किसी अन्य, "अधिक गारंटीकृत" कॉलबैक को बंद करना उचित हो सकता है। और देखो। –

+0

@ full.stack.ex, उत्तर के लिए धन्यवाद। आपका विचार दिलचस्प लगता है, लेकिन मुझे कहां कॉल करना चाहिए डेटाबेस खत्म करने के लिए, शायद खत्म हो सकता है? –

+1

यह आपके डिज़ाइन पर निर्भर करता है जिसे मैं थोड़ा जानता हूं। कप्तान बनल बजाना, वास्तविक समस्या की तरह दिखता है जीवन चक्र में कहीं अतिरिक्त _open_ में है। इसका मतलब है कि निर्माण और विनाश सममित द्वारा होना चाहिए। तो ऑनर्यूम/ऑन पॉज़ या ऑनस्टार्ट/ऑनस्टॉप अच्छे जोड़े होंगे। और ऐसा लगता है कि जब तक एक लंबी जीवित सेवा की तरह कुछ नहीं है और डीबी या उसके जैसा कुछ स्थिर संदर्भ है, तो क्रेट/ऑन डस्ट्रॉय पर ऐसा प्रतीत होता है। मैं कोड को ब्रांच करता हूं, रोलबैक अपडेट प्रकाशित करने के लिए तैयार होने के कारण, समरूप रूप से उस सामान को ध्यान से रखने के लिए अपना सर्वश्रेष्ठ प्रयास करें, (और मानव-) परीक्षण, प्रकाशित और निगरानी करें। –

उत्तर

2

onDestroy() केवल तभी कॉल किया जाएगा जब गतिविधि समाप्त हो जाती है/नष्ट हो जाती है/ढेर से हटा दी जाती है। जब आप गतिविधि से बाहर निकल रहे हैं onStop() कहा जाएगा। अगर आपको अपना वर्तमान डिज़ाइन रखना है, तो बस onStop() में बंद करें। नोट: वर्तमान गतिविधि के स्टॉप पर नई/अगली गतिविधि के क्रेट/ऑनस्टार्ट के बाद कॉल किया जाएगा।

आप एक ही डीबी आप एक SQLiteOpenHelper वर्ग के रूप में pawelieba ने उल्लेख किया इसके अलावा, आप आवेदन कक्षा में SQLite db संदर्भ हो सकता है का उपयोग कर सकते हैं और सिर्फ़ सभी गतिविधियों में संदर्भ का उपयोग कर सकते,

की तरह है, तो ((MyApplication)getApplication()).db

एप्लिकेशन कक्षा के onCreate() में बस डीबी खोलें और इसे onTerminate() पर बंद करें।

आप इस त्रुटि के लिए अन्य SO उत्तरों को भी देख सकते हैं। इससे पहले कई बार पूछा गया है।

java.lang.illegalstateexception database not open android

Android java.lang.IllegalStateException database already closed

Android insert the data SQLite error Caused by java.lang.IllegalStateException: database not open

+0

आपको बहुत धन्यवाद @ Atrix1987, मैं आपके समाधान का प्रयास करूंगा। –

1

SQLite डेटाबेस देशी इंटरफ़ेस जो SQLiteDatabase के माध्यम से पहुँचा जा सकता है है:

आज, मैं एक नया डेटाबेस का उपयोग करने के लिए संबंधित त्रुटि मिली।
SQLiteDatabaseSQLiteOpenHelper में कैश किया गया है जो SQLiteDatabase का उदाहरण प्रदान करने का ख्याल रखता है, यह सिंगलटन पैटर्न है।

मेरे अनुभव से, आपको SQLiteOpenHelper का एक उदाहरण होना चाहिए और इससे SQLiteDatabase कैश किया जाना चाहिए। फिर आपको SQLiteDatabase को बंद/खोलने की देखभाल करने की आवश्यकता नहीं है।

एप्लिकेशन के लिए SQLiteOpenHelper का एक उदाहरण ऐप में SQLiteDatabase का एक उदाहरण होना जरूरी है। यह देशी डेटाबेस में बहु थ्रेडेड पहुंच के साथ समस्याओं को हल करेगा।

संक्षेप में: SQLiteOpenHelper का सिंगलटन जिसमें से आप प्रत्येक क्वेरी के लिए डेटाबेस प्राप्त करते हैं।
मैं बदसूरत सिंगलटन पैटर्न से निपटने के लिए रोबोगुइस का उपयोग कर रहा हूं।

+0

धन्यवाद @pawelzieba। ठीक है, तो मुझे प्रत्येक गतिविधि में एक नया SQLiteOpenHelper ऑब्जेक्ट बनाना है जहां मुझे डेटाबेस तक पहुंचने की आवश्यकता है? सही? –

+0

नहीं, मेरा मतलब है कि पूरे ऐप के लिए 'SQLiteOpenHelper' का सिंगलटन होना चाहिए। आपके मामले में, सबसे आसान तरीका, इसे 'android.app.Aplication' वर्ग' में लागू करना हो सकता है, मुझे लगता है। – pawelzieba

+0

ठीक है, तो मुझे इसके समान कुछ उपयोग करना होगा: http://nerdwa.com/index.php/2011/09/database-sqliteopenhelper-singleton-class-for-android/ और फिर जब मुझे आवश्यकता हो तो ऑब्जेक्ट को इंस्टेंट करें? –

1

मुझे एक परियोजना में एक ही समस्या थी जिस पर मैंने काम किया था।

प्रोजेक्ट ने डेटा एक्सेस लेयर (डीएएल) का उपयोग किया जो एक अमूर्त वर्ग था जिसमें स्थिर-पाठ डेटाबेस से डेटा पुनर्प्राप्त करने के लिए उपयोग की जाने वाली स्थिर विधियां थीं। तरीकों ने डेटाबेस खोला, डेटा पुनर्प्राप्त किया और डीबी बंद कर दिया। यह डीबी बंद होने पर एक अपवाद को फेंक दिया जाता है। हमेशा नहीं और सभी फोन पर नहीं।

समस्या तब चली गई जब मैंने content provider लागू किया और इसे डीएएल के बजाय इस्तेमाल किया।

+0

सुझाव के लिए बहुत बहुत धन्यवाद। मैं इस पर एक नज़र डालेगा और यह देखने के लिए कुछ दिनों का प्रयास करूंगा कि क्या कोई त्रुटि है या नहीं। –

0

के बाद क्वेरी SQLite से डेटा प्राप्त करने के लिए सुनिश्चित

  • पास cusor रहें।

  • अद्यतन में लेनदेन का उपयोग करें, एसक्लाइट में डालें।

लेकिन कुछ समय शायद हम कई क्वेरी दृश्यों में शामिल हों का उपयोग करें, यह क्वेरी करने के लिए मंदिर तालिका बनाया है और शायद इसे तुरंत बंद नहीं किया

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