问题描述
首先,数据库损坏是故意的,这是对无效的数据库文件上传的测试。 我的问题是异常 (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 (将#修改为@)