2017-01-25 15 views
6

Một số người dùng trực tiếp trong ứng dụng của tôi đang gặp phải tham nhũng cơ sở dữ liệu SQLite. Khi chúng tôi đã thu thập được ghi từ những người dùng chúng ta tìm thấy bên dưới thông tin chi tiết:Cách sử dụng DefaultDatabaseErrorHandler để xử lý tham nhũng cơ sở dữ liệu trong Android

E/SQLiteLog(14085): (11) database corruption at line 57189 of [b3bb660af9] 
E/SQLiteLog(14085): (11) Invalid page count: nPage: 52, nPageFile: 50 
E/SQLiteLog(14085): (11) lockBtree() error, rc: 11, printing out first page (size: 32768) of DB /data/data/com.app.testpackagename/files//db/statictext_v3.0_DE.db 
E/SQLiteLog(14085): (11) Page (1) has been corrupted 

E/SQLiteLog(13318): (11) database disk image is malformed 
E/DefaultDatabaseErrorHandler(13318): Corruption reported by sqlite on database: /data/data/com.app.testpackagename/files//db/statictext_v3.0_DE.db 
E/SQLiteLog(13318): (11) database corruption at line 57189 of [b3bb660af9] 
E/SQLiteLog(13318): (11) Invalid page count: nPage: 52, nPageFile: 50 
E/SQLiteLog(13318): (11) lockBtree() error, rc: 11, printing out first page (size: 32768) of DB /data/data/com.app.testpackagename/files//db/statictext_v3.0_DE.db 
E/SQLiteLog(13318): (11) Page (1) has been corrupted 

Cơ sở dữ liệu tham nhũng là cơ sở dữ liệu tĩnh (nó đã được cài đặt sẵn các hồ sơ và chúng tôi không làm bất kỳ Chèn, Cập nhật, Alter , Xóa trừ Chọn dữ liệu từ nó.

cơ sở dữ liệu này là tài sản của ứng dụng của tôi và tôi đang lắp nó vào điện thoại và lấy o của nó bject với

this.staticDb = SQLiteDatabase.openDatabase(AppDelegate.getFileDirectory() + "/" + SDCARD_FOLDER_NAME +DB_FOLDER_NAME + "/" + Dbpath, null, SQLiteDatabase.NO_LOCALIZED_COLLATORS | SQLiteDatabase.OPEN_READONLY); 

Tôi muốn xử lý ngoại lệ này với DefaultDatabaseErrorHandler bằng cách sử dụng phương pháp onCorruption của lớp này nhưng không nhận được bất kỳ tài liệu thích hợp để thực hiện. Tôi có thể sử dụng lớp này trong trường hợp của tôi không?

Trả lời

1
SQLiteDatabase.openDatabase(context.getFileDirectory() + "/" + "sd_card_name" + "db_folder_name" + "/" + "dbPath", 
       null, SQLiteDatabase.NO_LOCALIZED_COLLATORS | SQLiteDatabase.OPEN_READONLY, 
       new DatabaseErrorHandler() { 
        @Override 
        public void onCorruption(SQLiteDatabase dbObj) { 
         //do whatever you want to do 
        } 
       }); 
+0

cảm ơn, tôi sẽ cố gắng với điều này. –

+0

nó hoạt động cho tôi nhưng yêu cầu 'SQLiteDatabase.OPEN_READWRITE' thay vì 'SQLiteDatabase.OPEN_READONLY' –

+0

Phụ thuộc vào loại kết nối bạn muốn thiết lập với cơ sở dữ liệu – Dibzmania

0

Các database implementation chỉ cố gắng để mở cơ sở dữ liệu một lần nữa sau khi xử lý được gọi là:

private void open() { 
    ... 
     try { 
      openInner(); 
     } catch (SQLiteDatabaseCorruptException ex) { 
      onCorruption(); 
      openInner(); 
     } 
    ... 

Vì vậy, những gì bạn phải làm là để thay thế các tập tin cơ sở dữ liệu với một bản sao làm việc.

DefaultDatabaseErrorHandler không hữu ích cho bạn; bạn phải triển khai DatabaseErrorHandler của riêng mình và cung cấp cho số openDatabase().

+0

tôi có thể ghi đè lên hàm gọi lại() gọi lại trong lớp học của tôi –

+0

Yup, bạn có thể. Tôi đã thêm câu trả lời – Dibzmania

+0

@CL. Tôi nghĩ rằng lần gọi thứ hai 'openInner' là để thử lại. Nếu điều đó không thành công, ngoại lệ sẽ bị bắt và kết nối cơ sở dữ liệu bị đóng. Nó có ý nghĩa – Dibzmania

Các vấn đề liên quan