计算数据库实时数据时出现异常 - 迁移期间崩溃
Posted
技术标签:
【中文标题】计算数据库实时数据时出现异常 - 迁移期间崩溃【英文标题】:Exception while computing database live data - crash during migration 【发布时间】:2019-10-20 16:01:30 【问题描述】:我使用的是 cwac-saferoom 1.0.4 版 一些设备在将应用程序更新到新版本后立即出现此问题。
致命异常:java.lang.RuntimeException:计算时出现异常 数据库实时数据。 在 androidx.room.RoomTrackingLiveData$1.run(SourceFile:6) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) 在 java.lang.Thread.run(Thread.java:764)
来自 sqlcipher 本身的另一部分日志是:
由 net.sqlcipher.database.SQLiteException 引起:文件不是 数据库:,编译时:从 sqlite_master 中选择 count(*); 在 net.sqlcipher.database.SQLiteCompiledSql.native_compile(SourceFile) 在 net.sqlcipher.database.SQLiteCompiledSql.compile(SourceFile:3) 在 net.sqlcipher.database.SQLiteCompiledSql.(SourceFile:12) 在 net.sqlcipher.database.SQLiteProgram.(SourceFile:18) 在 net.sqlcipher.database.SQLiteQuery.(SourceFile:1) 在 net.sqlcipher.database.SQLiteDirectCursorDriver.query(SourceFile:9) 在 net.sqlcipher.database.SQLiteDatabase.rawQueryWithFactory(SourceFile:5) 在 net.sqlcipher.database.SQLiteDatabase.rawQuery(SourceFile:1) 在 net.sqlcipher.database.SQLiteDatabase.keyDatabase(SourceFile:6) 在 net.sqlcipher.database.SQLiteDatabase.openDatabaseInternal(SourceFile:4) 在 net.sqlcipher.database.SQLiteDatabase.openDatabase(SourceFile:10) 在 net.sqlcipher.database.SQLiteDatabase.openOrCreateDatabase(SourceFile:8) 在 net.sqlcipher.database.SQLiteOpenHelper.getWritableDatabase(SourceFile:14) 在 net.sqlcipher.database.SQLiteOpenHelper.getWritableDatabase(SourceFile:2) 在 com.commonsware.cwac.saferoom.Helper$OpenHelper.getWritableSupportDatabase(SourceFile:2) 在 com.commonsware.cwac.saferoom.Helper.getWritableDatabase(SourceFile:5) 在 androidx.room.RoomDatabase.createInvalidationTracker(SourceFile:25) 创建OpenHelper 交易中 在 androidx.room.RoomDatabase.assertNotSuspendingTransaction(SourceFile:3) 在 androidx.room.RoomDatabase.createInvalidationTracker(SourceFile:18) 创建OpenHelper 询问 在 androidx.room.util.DBUtil.query(SourceFile:1) 在 com.myapp.MainActivity$onResume$2.onChanged(SourceFile:1) 在 com.myapp.MainActivity$onResume$2.call(SourceFile:1) 在 androidx.room.RoomTrackingLiveData$1.run(SourceFile:5) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) 在 java.lang.Thread.run(Thread.java:764)
【问题讨论】:
新版应用与上一版相比有何不同?您使用的是新版本的 SafeRoom,如果是,旧版本是什么?您是否正在升级您的数据库架构?顺便说一句,在这里发布堆栈跟踪时,您可能需要对它们进行去混淆处理。 拥有旧版本的安全室 - 1.0.2 并在 3 天前移至 1.0.4。起初我尝试迁移到产生Caused by net.sqlcipher.database.SQLiteException: file is not a database: , while compiling: select count(*) from sqlite_master;
的新格式试图避免它=我只是移动到一个新的文件名并从头开始创建数据库。仍然得到相同的结果 - 1 个问题是文件不是数据库,第二个是这个
1.0.2 和 1.0.4 使用相同的数据库格式 -- 数据库格式更改发生在 0.x 和 1.0.0 之间。除此之外,我没有太多事情要做。 “不是错误”是来自 SQLite 的通用消息(甚至不是 SQLCipher,更不用说 SafeRoom)。如果您制定了可重现的测试用例,请在 SafeRoom 存储库中提出问题,我可以查看它。
是的,我不得不从 0.x 迁移到 1.x,从那时起问题就出现了。但是从那以后,我为没有迁移的数据库创建了一个新名称,但我仍然得到了问题的陈述。我会尝试创建一个合适的测试用例。
【参考方案1】:
safeRoom 已停用,不再受支持。考虑使用 sqlcipher。
https://github.com/sqlcipher/android-database-sqlcipher#using-sqlcipher-for-android-with-room
【讨论】:
以上是关于计算数据库实时数据时出现异常 - 迁移期间崩溃的主要内容,如果未能解决你的问题,请参考以下文章
从 Google Firebase 实时数据库读取 google maps 标记数据时出现问题