Android Studio Room 和 DAO:无法捕获 SQLiteDatabaseCorruptException

问题描述

首先,数据库损坏是故意的,这是对无效的数据库文件上传的测试。 我的问题是异常 (sqliteDatabaseCorruptException) 出现在 DAO 自动生成的 java 代码中:

at com.cormorant.fishingtracker.database.DBDao_Impl$234.compute(DBDao_Impl.java:10024)

所以我无法尝试抓住它!它发生在 AsyncTask 内部,但未捕获异常!我试过了:

protected void openDatabase(OnopenDatabaseResult onopenDatabaseResult) {
        dataRepository.openDatabase(getApplication());
        try {
            dataRepository.getRecordsCount(null,new DataRepository.AsyncResponse<Long>() {
                @Override
                public void processFinish(Long output) {
                    onopenDatabaseResult.onResult(output!=null);
                }
            });
        } catch (Exception exception) {
            exception.printstacktrace();
            onopenDatabaseResult.onResult(false);
        }
    }

也在 AsyncTask 内部:

public class getRecordsCountAsyncTask extends executeOutAsyncTask<Long> {

        getRecordsCountAsyncTask(DBDao dao,Class<? extends Base> klass,AsyncResponse<Long> delegate) {
            super(dao,klass,delegate);
        }

        @Override
        protected Long newDoInBackground() {
            if (mClass== null) {
                Long ret;
                try {
                    ret = mAsyncTaskDao.countTables();
                } catch (Exception exception) {
                    ret =null;
                    exception.printstacktrace();
                }
                return ret;
            } 
...

如何在打开数据库时检测损坏的文件代码如下)?

    public static Dbroom getDatabase(final Context context) {
        context_ = context;
        if (INSTANCE == null) {
            synchronized (Dbroom.class) {
                INSTANCE = Room.databaseBuilder(context.getApplicationContext(),Dbroom.class,dbFileName)
                        .addMigrations(MIGRATION_1_2,MIGRATION_2_3,MIGRATION_3_4,MIGRATION_4_5)
                        .fallbackToDestructiveMigration() // Wipes and rebuilds instead of migrating if no Migration object.
                        .addCallback(sRoomDatabaseCallback)
                        .build();
            }
        }
        return INSTANCE;
    }

整个日志:


04-28 11:20:44.218 12854-12879/com.cormorant.fishingtracker E/sqliteLog: (26) file is encrypted or is not a database
04-28 11:20:44.219 12854-12879/com.cormorant.fishingtracker E/sqliteLog: (26) file is encrypted or is not a database
04-28 11:20:44.219 12854-12879/com.cormorant.fishingtracker E/sqliteDatabase: Failed to open database '/data/user/0/com.cormorant.fishingtracker/databases/fishingtracker'.
    android.database.sqlite.sqliteDatabaseCorruptException: file is encrypted or is not a database (code 26):,while compiling: PRAGMA journal_mode
        at android.database.sqlite.sqliteConnection.nativePrepareStatement(Native Method)
        at android.database.sqlite.sqliteConnection.acquirePreparedStatement(sqliteConnection.java:887)
        at android.database.sqlite.sqliteConnection.executeForString(sqliteConnection.java:632)
        at android.database.sqlite.sqliteConnection.setJournalMode(sqliteConnection.java:318)
        at android.database.sqlite.sqliteConnection.setWalModeFromConfiguration(sqliteConnection.java:289)
        at android.database.sqlite.sqliteConnection.open(sqliteConnection.java:213)
        at android.database.sqlite.sqliteConnection.open(sqliteConnection.java:191)
        at android.database.sqlite.sqliteConnectionPool.openConnectionLocked(sqliteConnectionPool.java:463)
        at android.database.sqlite.sqliteConnectionPool.open(sqliteConnectionPool.java:185)
        at android.database.sqlite.sqliteConnectionPool.open(sqliteConnectionPool.java:177)
        at android.database.sqlite.sqliteDatabase.openInner(sqliteDatabase.java:806)
        at android.database.sqlite.sqliteDatabase.open(sqliteDatabase.java:794)
        at android.database.sqlite.sqliteDatabase.openDatabase(sqliteDatabase.java:694)
        at android.app.ContextImpl.openorCreateDatabase(ContextImpl.java:571)
        at android.content.Contextwrapper.openorCreateDatabase(Contextwrapper.java:269)
        at android.database.sqlite.sqliteOpenHelper.getDatabaseLocked(sqliteOpenHelper.java:223)
        at android.database.sqlite.sqliteOpenHelper.getWritableDatabase(sqliteOpenHelper.java:163)
        at androidx.sqlite.db.framework.FrameworksqliteOpenHelper$OpenHelper.getWritableSupportDatabase(FrameworksqliteOpenHelper.java:96)
        at androidx.sqlite.db.framework.FrameworksqliteOpenHelper.getWritableDatabase(FrameworksqliteOpenHelper.java:54)
        at androidx.room.RoomDatabase.query(RoomDatabase.java:238)
        at com.cormorant.fishingtracker.database.DBDao_Impl$209.compute(DBDao_Impl.java:8046)
        at com.cormorant.fishingtracker.database.DBDao_Impl$209.compute(DBDao_Impl.java:8032)
        at androidx.lifecycle.ComputableLiveData$2.run(ComputableLiveData.java:101)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
        at java.lang.Thread.run(Thread.java:818)
04-28 11:20:44.222 12854-12881/com.cormorant.fishingtracker E/sqliteLog: (26) file is encrypted or is not a database
04-28 11:20:44.223 12854-12881/com.cormorant.fishingtracker E/sqliteLog: (26) file is encrypted or is not a database
    
    
    --------- beginning of crash
04-28 11:20:44.224 12854-12879/com.cormorant.fishingtracker E/AndroidRuntime: FATAL EXCEPTION: arch_disk_io_0
    Process: com.cormorant.fishingtracker,PID: 12854
    android.database.sqlite.sqliteDatabaseCorruptException: file is encrypted or is not a database (code 26):,while compiling: PRAGMA journal_mode
        at android.database.sqlite.sqliteConnection.nativePrepareStatement(Native Method)
        at android.database.sqlite.sqliteConnection.acquirePreparedStatement(sqliteConnection.java:887)
        at android.database.sqlite.sqliteConnection.executeForString(sqliteConnection.java:632)
        at android.database.sqlite.sqliteConnection.setJournalMode(sqliteConnection.java:318)
        at android.database.sqlite.sqliteConnection.setWalModeFromConfiguration(sqliteConnection.java:289)
        at android.database.sqlite.sqliteConnection.open(sqliteConnection.java:213)
        at android.database.sqlite.sqliteConnection.open(sqliteConnection.java:191)
        at android.database.sqlite.sqliteConnectionPool.openConnectionLocked(sqliteConnectionPool.java:463)
        at android.database.sqlite.sqliteConnectionPool.open(sqliteConnectionPool.java:185)
        at android.database.sqlite.sqliteConnectionPool.open(sqliteConnectionPool.java:177)
        at android.database.sqlite.sqliteDatabase.openInner(sqliteDatabase.java:806)
        at android.database.sqlite.sqliteDatabase.open(sqliteDatabase.java:794)
        at android.database.sqlite.sqliteDatabase.openDatabase(sqliteDatabase.java:694)
        at android.app.ContextImpl.openorCreateDatabase(ContextImpl.java:571)
        at android.content.Contextwrapper.openorCreateDatabase(Contextwrapper.java:269)
        at android.database.sqlite.sqliteOpenHelper.getDatabaseLocked(sqliteOpenHelper.java:223)
        at android.database.sqlite.sqliteOpenHelper.getWritableDatabase(sqliteOpenHelper.java:163)
        at androidx.sqlite.db.framework.FrameworksqliteOpenHelper$OpenHelper.getWritableSupportDatabase(FrameworksqliteOpenHelper.java:96)
        at androidx.sqlite.db.framework.FrameworksqliteOpenHelper.getWritableDatabase(FrameworksqliteOpenHelper.java:54)
        at androidx.room.RoomDatabase.query(RoomDatabase.java:238)
        at com.cormorant.fishingtracker.database.DBDao_Impl$209.compute(DBDao_Impl.java:8046)
        at com.cormorant.fishingtracker.database.DBDao_Impl$209.compute(DBDao_Impl.java:8032)
        at androidx.lifecycle.ComputableLiveData$2.run(ComputableLiveData.java:101)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
        at java.lang.Thread.run(Thread.java:818)
04-28 11:20:44.228 12854-12881/? E/sqliteDatabase: Failed to open database '/data/user/0/com.cormorant.fishingtracker/databases/fishingtracker'.
    android.database.sqlite.sqliteDatabaseCorruptException: file is encrypted or is not a database (code 26):,while compiling: PRAGMA journal_mode
        at android.database.sqlite.sqliteConnection.nativePrepareStatement(Native Method)
        at android.database.sqlite.sqliteConnection.acquirePreparedStatement(sqliteConnection.java:887)
        at android.database.sqlite.sqliteConnection.executeForString(sqliteConnection.java:632)
        at android.database.sqlite.sqliteConnection.setJournalMode(sqliteConnection.java:318)
        at android.database.sqlite.sqliteConnection.setWalModeFromConfiguration(sqliteConnection.java:289)
        at android.database.sqlite.sqliteConnection.open(sqliteConnection.java:213)
        at android.database.sqlite.sqliteConnection.open(sqliteConnection.java:191)
        at android.database.sqlite.sqliteConnectionPool.openConnectionLocked(sqliteConnectionPool.java:463)
        at android.database.sqlite.sqliteConnectionPool.open(sqliteConnectionPool.java:185)
        at android.database.sqlite.sqliteConnectionPool.open(sqliteConnectionPool.java:177)
        at android.database.sqlite.sqliteDatabase.openInner(sqliteDatabase.java:806)
        at android.database.sqlite.sqliteDatabase.open(sqliteDatabase.java:794)
        at android.database.sqlite.sqliteDatabase.openDatabase(sqliteDatabase.java:694)
        at android.app.ContextImpl.openorCreateDatabase(ContextImpl.java:571)
        at android.content.Contextwrapper.openorCreateDatabase(Contextwrapper.java:269)
        at android.database.sqlite.sqliteOpenHelper.getDatabaseLocked(sqliteOpenHelper.java:223)
        at android.database.sqlite.sqliteOpenHelper.getWritableDatabase(sqliteOpenHelper.java:163)
        at androidx.sqlite.db.framework.FrameworksqliteOpenHelper$OpenHelper.getWritableSupportDatabase(FrameworksqliteOpenHelper.java:96)
        at androidx.sqlite.db.framework.FrameworksqliteOpenHelper.getWritableDatabase(FrameworksqliteOpenHelper.java:54)
        at androidx.room.RoomDatabase.query(RoomDatabase.java:238)
        at com.cormorant.fishingtracker.database.DBDao_Impl$217.compute(DBDao_Impl.java:8772)
        at com.cormorant.fishingtracker.database.DBDao_Impl$217.compute(DBDao_Impl.java:8758)
        at androidx.lifecycle.ComputableLiveData$2.run(ComputableLiveData.java:101)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
        at java.lang.Thread.run(Thread.java:818)
04-28 11:20:44.229 12854-12880/? E/sqliteLog: (26) file is encrypted or is not a database
04-28 11:20:44.229 12854-12880/? E/sqliteLog: (26) file is encrypted or is not a database
04-28 11:20:44.235 12854-12881/? I/Process: Sending signal. PID: 12854 SIG: 9

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...