2011-02-22 22 views
14

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? : '(

Trả lời

1

Các kinh điển Good Way để khôi phục lại cơ sở dữ liệu tham nhũng là để đổ nó ra như SQL và sau đó đọc nó lại vào một cơ sở dữ liệu mới Đó là chết dễ dàng với các công cụ sqlite:.

sqlite in.db .dump | sqlite out.db 

. .. nhưng, tất nhiên, bạn cần phải làm điều đó trong mã, và tôi thực sự không biết nếu .dump có sẵn từ bất cứ nơi nào.

Tôi muốn bạn có thể muốn xem nó bị hỏng như thế nào ở nơi đầu tiên --- SQLite luôn luôn là đá vững chắc đối với tôi, mặc dù tôi đã từng sử dụng nó trên bộ nhớ trong. Bạn có thể kiểm tra hệ thống tập tin FAT để xem liệu nó có bị hỏng không? g., máy ảnh kỹ thuật số sẽ triệt tiêu hệ thống tập tin trên thẻ theo nhiều cách khác nhau ...

0

Trong ứng dụng của bạn, bạn có đóng cơ sở dữ liệu trước khi thoát khỏi hoạt động không? Xem nhật ký và kiểm tra xem có bất kỳ lỗi hoặc cảnh báo nào khi bạn chạy ứng dụng của mình hay không.

1

Android xóa cơ sở dữ liệu là một thực tế là issue.

Tôi vừa nhận ra một giải pháp có thể sử dụng SQLJet thay vì triển khai SQLite mặc định.
Vì tên của nó không được đề xuất, SQLJet là một trình khách Java SQLite nguồn mở và nó hoạt động trên Android.

+0

Cảm ơn, điều đó thực sự trông khá thú vị! – pgsandstrom

+0

@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

+0

SQLite chỉ không có lỗi này –