2011-02-22 33 views
14

En son iki hafta içinde, uygulamamdaki bir güncellemeyi yayınlamadan, bozuk veritabanlarıyla ilgili bir sürü rapor almaya başladım. Aşağıda stacktrace. Android veritabanını açamıyor ve bilgisayarımdaki sqlite-manager programını da yapamadı. Ancak, firefox’a SQLite manager-addon onu açabilir. "Kompakt veritabanı" komutunu çalıştırdıktan sonra, veritabanı düzeltildi ve Android'de açabiliyordum. Uygulamamda böyle bir şey yapmanın bir yolu var mı? Büyük sorun şu ki, veritabanını açmayı denemem, çünkü Android'in daha yeni sürümleri veritabanını derhal silecek ve değiştirecek. PRAGMA İfadeleri bir şekilde veritabanını açmadan gerçekleştirilebilir mi?Android veritabanı bozuk, ancak SQLite Manager'da açılabilir. Kurtarılabilir?

Selamlar,

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) 

Düzenleme:

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

Ama çalıştırdığınızda bu: Ben müdür böyle veritabanını açmak için

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

Ben bu olsun:

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

Düzenleme2: Veritabanını süpürmenin sorunu çözdüğünü fark ettim. Ama benim app içinden exeSQL ("vakum") ile vakum, bu yardımcı olmaz. Bu neden? : '(

cevap

1

bozuk veritabanını kurtarmak için kanonik İyi Yolu SQL gibi dışarı dökümü ve tekrar yeni bir veritabanına onu okumaktır Bu sqlite aracı ile kolay ölü.

sqlite in.db .dump | sqlite out.db 

. ..but, tabii ki, kod içinde yapmanız gerekir ve gerçekten bilmiyorum .dump herhangi bir yerden kullanılabilir olup olmadığını bilmiyorum.

Buranın nasıl bozulduğunu görmek isteyebilirsiniz. ilk etapta --- SQLite benim için her zaman kaya gibi sağlamdı, ancak bunu sadece dahili depolamada kullandım. FAT dosya sistemini bozuk olup olmadığını görmek için kontrol edebilir misin? g., çeşitli karanlık yollarla kartlarda dosya sistemini tamamen işleyecek dijital kameralar ...

0

Uygulamanızdan çıkmadan önce veritabanınızı kapatır mısınız? Logcat'i izleyin ve uygulamanızı çalıştırdığınızda herhangi bir hata veya uyarı olup olmadığını kontrol edin.

1

Veritabanını silme Android, bir issue gerçekten.

Sadece varsayılan bir Android SQLite uygulaması yerine SQLJet kullanmak için bir çözüm olabileceğini fark ettim.
Adından da anlaşılacağı gibi, SQLJet açık kaynaklı bir Java SQLite istemcisidir ve Android'de çalışır.

+0

Teşekkürler, aslında oldukça ilginç görünüyor! – pgsandstrom

+0

@Nicolas Raoul SQLJet'in OP problemini nasıl çözeceğini/engelleyeceğini açıklayabilir misiniz? Ben merak ediyorum, çünkü OP ile aynı sorunları yaşıyorum :) – AgentKnopf

+0

SQLite sadece bu hata yok –

İlgili konular