2010-08-25 11 views
23

मेरा ऐप एक अपरिचित अपवाद हैंडलर का उपयोग करता है जो ऐप क्रैश होने पर मुझे स्टैक ट्रेस भेजता है। अक्सर मुझे यह रिपोर्ट यादृच्छिक उपयोगकर्ताओं से मिलती है।यादृच्छिक अपवाद android.database.sqlite.SQLiteException: डेटाबेस फ़ाइल को खोलने में असमर्थ

मैं इसे दोहराना नहीं कर सकता, डेटाबेस का उद्घाटन हमेशा मेरे मामले में सफल होता है। यह बाह्य एसडी कार्ड पर संग्रहीत डेटाबेस नहीं है, केवल SQLiteOpenHelper(context, "SomeName", null, someVersionCode) के साथ खोला गया डेटाबेस।

क्या आपके पास इसका कोई अनुभव है? डेटाबेस खोलने से पहले मैं क्या संभावनाएं देख सकता हूं?

धन्यवाद!

android.database.sqlite.SQLiteException: unable to open database file 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2496) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512) 
    at android.app.ActivityThread.access$2200(ActivityThread.java:119) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:123) 
    at android.app.ActivityThread.main(ActivityThread.java:4363) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:521) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
    at dalvik.system.NativeStart.main(Native Method) 
Caused by: android.database.sqlite.SQLiteException: unable to open database file 
    at android.database.sqlite.SQLiteDatabase.dbopen(Native Method) 
    at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1698) 
    at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:739) 
    at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:761) 
    at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:754) 
    at android.app.ApplicationContext.openOrCreateDatabase(ApplicationContext.java:476) 
    at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:193) 
    at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:98) 
+0

संपत्ति फ़ोल्डर के अंदर अपने डेटाबेस नाम सुनिश्चित करें और डेटाबेस का नाम घोषित डेटाबेस सहायक वर्ग में करने की कोशिश में ही है। और जब आप डेटाबेस कॉपी करने का प्रयास करते हैं तो डेटाबेस नाम के साथ अपने डेटाबेस का पथ देखें। अपना कोड यहां डालें ताकि अन्य आपके डेटाबेस सहायक वर्ग को देख सकें। – Maulik

+0

त्रुटि से पता चलता है कि डेटाबेस डेटाबेस नहीं खोल सका, इसका मतलब है कि आपने खुली डेटाबेस विधि में "SQLiteDatabase.OPEN_READWRITE" स्थिति सेट नहीं की है और अपनी डेटाबेस फ़ाइल के गुणों में भी परिवर्तन को पढ़ने की अनुमति को बदलना है। दोनों मामलों के ऊपर सुनिश्चित करें। – Maulik

+0

इस [लिंक] पर जाएं (http://stackoverflow.com/questions/4187631/unable-to-open-database-file-when-using-sqliteopenhelper-with-instrumentation) यह आपके लिए – Engineer

उत्तर

2

संभव परिदृश्यों जब यह हो सकता है में से एक - है जब आप कई धागे से अपने डेटाबेस फ़ाइल का उपयोग और जब फ़ाइल धागे में से एक ने बंद कर दिया है वह आपसे कुछ संशोधन के लिए इसे खोलने के लिए कोशिश कर रहे हैं, जबकि एक और धागा

+0

भी मदद कर सकता है एक ही मुद्दा मिला। मैं अपने ज्ञापन को डीबी में सहेजता हूं। जब मैं एक नई प्रविष्टि डालता हूं और होम स्क्रीन पर वापस 'बैक' या 'होम' कुंजी दबाता हूं। उसके बाद मैं अपने ज्ञापन को पुनर्स्थापित करने के लिए बैकअप एजेंट का उपयोग करने का प्रयास करता हूं, मुझे हमेशा एक ही त्रुटि मिलती है (त्रुटि कोड 14)। यदि मैं ज्ञापन प्रक्रिया को मारता हूं, तो मेरा ज्ञापन बैकअप एजेंट सामान्य रूप से काम कर सकता है। मुझे लगता है कि डीबी एक और थ्रेड द्वारा खोला गया है। मैं इसे कैसे बंद कर सकता हूं? कोई भी समाधान प्रदान कर सकता है? –

5

मुझे अपने एंड्रॉइड फर्मवेयर को अपग्रेड करने के बाद एक ही त्रुटि मिली। डेटाबेस पुराने फर्मवेयर द्वारा बनाया गया था और इसलिए नए फर्मवेयर द्वारा खोला नहीं जा सका। उपयोगकर्ता अनइंस्टॉल और अपने ऐप को पुनर्स्थापित करके इस त्रुटि को हल कर सकते हैं।

0

@yuku

मुद्दा मैं सामना करना पड़ा है इस तरह की है, मैं उस तरह की तरह इस मुद्दे को हल कर लिया है।

  1. हम जाँच करें कि क्या पुरानी डेटाबेस रूप नया डेटाबेस ही है की जरूरत है कुछ नया डेटाबेस में उस समय हम पुराने डेटाबेस हटा सकते हैं और नए डेटाबेस स्थापित करने या प्रति के रूप में तालिका में परिवर्तन की जरूरत है बदल नई डाटाबेस

  2. दूसरा विकल्प सिर्फ स्थापना रद्द करें अपने पुराने आवेदन आसान है और की तुलना में नया आवेदन स्थापित

आशा है कि यह आपके लिए काम करेगा .. !!!

0

किसी भी डेटाबेस एप्लिकेशन के लिए, मैं पहले स्क्लाइट डेटाबेस को फ़ायरफ़ॉक्स के स्क्लाइट प्रबंधक एडन के साथ बना देता हूं और इसे/res/raw फ़ोल्डर में ले जाता हूं। फिर मेरे कोड में, मैं जांचता हूं कि इस ऐप के लिए डेटाबेस/डेटा/डेटा में डेटाबेस मौजूद है या नहीं। यदि नहीं, तो मैं अपने कोड के साथ उस निर्देशिका में डीबी फ़ाइल की प्रतिलिपि बनाता हूं।

आपकी स्थिति के लिए, यह देखने के बिना सटीक कारण निर्धारित करना मुश्किल है कि आपने अपना डेटाबेस कैसे बनाया है और आप इसका उपयोग कैसे कर रहे हैं। इस अपवाद को प्राप्त करने के मुद्दे के लिए कई कारण हो सकते हैं। कुछ मुद्दों का उल्लेख पहले से ही किया गया है। मैं एक का उल्लेख करना चाहता हूँ। आप इस

SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.NO_LOCALIZED_COLLATORS); 

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

Populating SQLite Database

0

मैं इस मुद्दे का सामना करना पड़ा है।

मेरे अनुप्रयोगों में से एक एक ही तरीके से व्यवहार कर रहा था, क्योंकि मैंने स्प्लैश स्क्रीन पर निर्दिष्ट स्थान से डेटाबेस की प्रतिलिपि बनाने के लिए कोड जोड़ा था (स्क्रीन जो ऐप लॉन्च होने पर दिखाई देती है और स्वचालित रूप से कुछ सेकंड के बाद दृश्य को बंद कर देती है)।

और कुछ मामलों में क्या हो रहा था, कि डेटाबेस निर्दिष्ट समय सीमा में कॉपी नहीं हो रहा था और ऐप के भीतर से इसे एक्सेस करने से अपवाद पैदा हो रहा था।

मैं क्या किया था,

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

यदि पिछले संस्करण पर ऐप इंस्टॉल किया जा रहा है, तो एक और समाधान हो सकता है, यदि डेटा रोकथाम आवश्यक है तो नए संस्करण में ऐप के पिछले संस्करण से सहेजे गए डेटा को कॉपी करने के लिए कोड लिखें और नए संस्करण में अलग-अलग मॉडल हैं पिछले संस्करण की है।

2

यदि आपका ऐप एक ही समय में एकाधिक थ्रेड से डेटाबेस खोलता है तो यह अपवाद का कारण हो सकता है।

कृपया डेटाबेस सिंक्रनाइज़ किए गए विधि को खोलने के लिए सिंक्रनाइज़ विधि का प्रयास करें, डेटाबेस को एक ही समय में एकाधिक थ्रेड से खोलने की अनुमति नहीं दी जाएगी। अपने dbHelper

private synchronized SQLiteDatabase getWritableDB() { 
     //get your database and return it from this method. 
} 

में कोड के नीचे रख दिया और इन विधि जब अपने डाटाबेस हो रही है कहते हैं। उम्मीद है कि यह मदद करेगा।

0

पुनर्स्थापित आवेदन और डेटाबेस दही के लिए सिंक्रनाइज़ ब्लॉक का उपयोग संचालन :)

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