2011-02-22 27 views
14

नवीनतम दो सप्ताह में, मेरे ऐप को अपडेट जारी किए बिना, मैंने दूषित डेटाबेस के साथ रिपोर्ट का एक समूह प्राप्त करना शुरू कर दिया है। नीचे stacktrace है। एंड्रॉइड डेटाबेस नहीं खोल सकता है, और न ही मेरे कंप्यूटर पर sqlite-manager प्रोग्राम सकता है। हालांकि, फ़ायरफ़ॉक्स में SQLite प्रबंधक-एडन इसे खोल सकता है। कमांड "कॉम्पैक्ट डेटाबेस" चलाने के बाद, डेटाबेस तय किया गया था और मैं इसे एंड्रॉइड में खोल सकता था। क्या कोई तरीका है कि मैं अपने ऐप के भीतर ऐसा कुछ कर सकता हूं? बड़ी समस्या यह है कि मैं डेटाबेस खोलने का भी प्रयास नहीं कर सकता, क्योंकि एंड्रॉइड के नए संस्करण तुरंत हटाएंगे और डेटाबेस को प्रतिस्थापित करेंगे, जैसा कि आप नीचे दिए गए स्टैकट्रैक में देख सकते हैं। क्या PRAGMA स्टेटमेंट डेटाबेस को खोलने के बिना किसी भी तरह निष्पादित किया जा सकता है?एंड्रॉइड डेटाबेस दूषित, लेकिन SQLite प्रबंधक में खोल सकते हैं। वसूली?

सादर,

02-22 09:55:20.245: ERROR/Database(5382): CREATE TABLE android_metadata failed 
02-22 09:55:20.245: ERROR/Database(5382): Failed to setLocale() when constructing, closing the database 
02-22 09:55:20.245: ERROR/Database(5382): android.database.sqlite.SQLiteDatabaseCorruptException: database disk image is malformed 
02-22 09:55:20.245: ERROR/Database(5382):  at android.database.sqlite.SQLiteDatabase.native_setLocale(Native Method) 
02-22 09:55:20.245: ERROR/Database(5382):  at android.database.sqlite.SQLiteDatabase.setLocale(SQLiteDatabase.java:1950) 
02-22 09:55:20.245: ERROR/Database(5382):  at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1818) 
02-22 09:55:20.245: ERROR/Database(5382):  at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:817) 
02-22 09:55:20.245: ERROR/Database(5382):  at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:851) 
02-22 09:55:20.245: ERROR/Database(5382):  at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:844) 
02-22 09:55:20.245: ERROR/Database(5382):  at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:540) 
02-22 09:55:20.245: ERROR/Database(5382):  at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:203) 

02-22 09:55:20.245: ERROR/Database(5382): Deleting and re-creating corrupt database /mnt/sdcard/myapp/backup.sqlite 
02-22 09:55:20.245: ERROR/Database(5382): android.database.sqlite.SQLiteDatabaseCorruptException: database disk image is malformed 
02-22 09:55:20.245: ERROR/Database(5382):  at android.database.sqlite.SQLiteDatabase.native_setLocale(Native Method) 
02-22 09:55:20.245: ERROR/Database(5382):  at android.database.sqlite.SQLiteDatabase.setLocale(SQLiteDatabase.java:1950) 
02-22 09:55:20.245: ERROR/Database(5382):  at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1818) 
02-22 09:55:20.245: ERROR/Database(5382):  at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:817) 
02-22 09:55:20.245: ERROR/Database(5382):  at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:851) 
02-22 09:55:20.245: ERROR/Database(5382):  at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:844) 
02-22 09:55:20.245: ERROR/Database(5382):  at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:540) 
02-22 09:55:20.245: ERROR/Database(5382):  at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:203) 

संपादित करें: मैं प्रबंधक इस तरह डेटाबेस को खोलने के लिए:

db = SQLiteDatabase.openDatabase(database, null, SQLiteDatabase.NO_LOCALIZED_COLLATORS); 

लेकिन जब मैं रन:

String sqlQuery = "pragma integrity_check"; 
db.execSQL(sqlQuery); 

मैं इस मिल:

ERROR/AndroidRuntime(9144): Caused by: android.database.sqlite.SQLiteDatabaseCorruptException: database disk image is malformed: pragma integrity_check 

संपादित 2: मुझे एहसास हुआ है कि डेटाबेस को खाली करने से समस्या ठीक हो जाती है। लेकिन अगर मैं अपने ऐप के अंदर से exuSQL ("वैक्यूम") के साथ वैक्यूम, यह मदद नहीं करता है। ऐसा क्यों है? : '(

उत्तर

1

एक भ्रष्ट डेटाबेस ठीक करने के लिए विहित अच्छा तरीका एसक्यूएल के रूप में यह बाहर डंप और फिर इसे एक नया डेटाबेस में वापस पढ़ने के लिए है यह SQLite उपकरण के साथ आसान मर चुका है:।

sqlite in.db .dump | sqlite out.db 

। ..पर, ज़ाहिर है, आपको कोड में ऐसा करने की ज़रूरत है, और मुझे नहीं पता कि डंप कहीं से भी उपलब्ध है।

मैं सुझाव दूंगा कि आप शायद यह देखना चाहते हैं कि यह कैसे भ्रष्ट हो रहा है पहली जगह --- SQLite हमेशा मेरे लिए ठोस चट्टान रहा है, हालांकि मैंने कभी भी इसे आंतरिक भंडारण पर उपयोग किया है। क्या आप यह देखने के लिए एफएटी फाइल सिस्टम देख सकते हैं कि यह भ्रष्ट है? मैंने देखा है, ई। जी।, डिजिटल कैमरे जो विभिन्न अस्पष्ट तरीकों से कार्ड पर फाइल सिस्टम को पूरी तरह से जोड़ देंगे ...

0

आपके ऐप में आप गतिविधि से बाहर निकलने से पहले डेटाबेस बंद कर देते हैं? लॉगकैट देखें और जांचें कि क्या आप अपना ऐप चलाते समय कोई त्रुटि या चेतावनियां हैं या नहीं।

1

डेटाबेस को हटाने वाला एंड्रॉइड वास्तव में issue है।

मुझे एहसास हुआ कि डिफ़ॉल्ट एंड्रॉइड SQLite कार्यान्वयन के बजाय SQLJet का उपयोग करने के लिए एक समाधान हो सकता है।
जैसा कि इसके नाम का सुझाव नहीं है, SQLJet एक ओपन सोर्स जावा SQLite क्लाइंट है, और यह एंड्रॉइड पर काम करता है।

+0

धन्यवाद, वास्तव में दिलचस्प लगता है! – pgsandstrom

+0

@ निकोलस राउल क्या आप समझा सकते हैं, एसक्यूएलजेट ओपी की समस्या को कैसे हल करेगा/इसे रोक देगा? मैं उत्सुक हूं, क्योंकि मुझे ओपी के समान मुद्दे हैं :) – AgentKnopf

+0

SQLite में यह बग नहीं है –