Trong hai tuần gần nhất, mà không phát hành bản cập nhật cho ứng dụng của tôi, tôi đã bắt đầu nhận được một loạt các báo cáo với cơ sở dữ liệu bị hỏng. Dưới đây là stacktrace. Android không thể mở cơ sở dữ liệu và không thể chương trình quản lý sqlite trên máy tính của tôi. Tuy nhiên, người quản lý SQL-addon để firefox có thể mở nó. Sau khi chạy lệnh "cơ sở dữ liệu nhỏ gọn", cơ sở dữ liệu đã được sửa và tôi có thể mở nó trong android. Có cách nào tôi có thể làm một cái gì đó như thế này trong ứng dụng của tôi? Vấn đề lớn là tôi thậm chí không thể mở cơ sở dữ liệu, bởi vì các phiên bản mới hơn của Android sẽ ngay lập tức xóa và thay thế cơ sở dữ liệu, như bạn có thể thấy trong stacktrace bên dưới. Tuyên bố PRAGMA có thể bằng cách nào đó được thực hiện mà không cần mở cơ sở dữ liệu không?Cơ sở dữ liệu Android bị hỏng, nhưng có thể mở trong Trình quản lý SQLite. Có thể phục hồi?
Kính trọng,
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)
Edit: Tôi quản lý để mở cơ sở dữ liệu như thế này:
db = SQLiteDatabase.openDatabase(database, null, SQLiteDatabase.NO_LOCALIZED_COLLATORS);
Nhưng khi tôi chạy này:
String sqlQuery = "pragma integrity_check";
db.execSQL(sqlQuery);
tôi có được điều này:
ERROR/AndroidRuntime(9144): Caused by: android.database.sqlite.SQLiteDatabaseCorruptException: database disk image is malformed: pragma integrity_check
Chỉnh sửa2: Tôi đã nhận ra rằng việc hút bụi cơ sở dữ liệu sẽ khắc phục được sự cố. Nhưng nếu tôi hút từ bên trong ứng dụng của tôi, với exeSQL ("chân không"), nó không giúp đỡ. Tại sao điều này? : '(
Cảm ơn, điều đó thực sự trông khá thú vị! – pgsandstrom
@Nicolas Raoul Bạn có thể giải thích, làm thế nào SQLJet sẽ giải quyết vấn đề của OP/ngăn chặn nó? Tôi tò mò, kể từ khi tôi có cùng một vấn đề như OP :) – AgentKnopf
SQLite chỉ không có lỗi này –