我将回答我自己的问题,这是问题描述。
所以我有一个在商店发布的应用程序,并且我想要发布的新版本,数据库架构已经改变,所以我自然不得不进行迁移,负责将其从版本3升级到最新版本5.这包括提供3到4和4到5的迁移。或者一次性从3到5。
这就是我所做的,我提供了这些迁移并将它们提供给Room databaseBuilder(),并且所有内容都已到位以模拟应用程序升级的场景(安装Store版本,运行它,登录,数据库创建,生成生产APK并通过终端安装在设备上,运行)
这样做总是产生以下异常:
05-19 02:38:00.363 6472-6522/co.myapp.app E/ROOM: Invalidation tracker is initialized twice :/.
05-19 02:38:00.378 6472-6549/co.myapp.app E/ROOM: Cannot run invalidation tracker. Is the db closed?
java.lang.IllegalStateException: The database '/data/user/0/co.myapp.app/databases/my_db' is not open.
at android.database.sqlite.SQLiteDatabase.throwIfNotOpenLocked(SQLiteDatabase.java:2765)
at android.database.sqlite.SQLiteDatabase.createSession(SQLiteDatabase.java:490)
at android.database.sqlite.SQLiteDatabase$1.initialValue(SQLiteDatabase.java:88)
at android.database.sqlite.SQLiteDatabase$1.initialValue(SQLiteDatabase.java:87)
at java.lang.ThreadLocal.setInitialValue(ThreadLocal.java:160)
at java.lang.ThreadLocal.get(ThreadLocal.java:150)
at android.database.sqlite.SQLiteDatabase.getThreadSession(SQLiteDatabase.java:484)
at android.database.sqlite.SQLiteProgram.getSession(SQLiteProgram.java:107)
at android.database.sqlite.SQLiteStatement.executeUpdateDelete(SQLiteStatement.java:64)
at android.arch.persistence.db.framework.FrameworkSQLiteStatement.executeUpdateDelete(FrameworkSQLiteStatement.java:45)
at android.arch.persistence.room.InvalidationTracker$1.run(InvalidationTracker.java:321)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
at java.lang.Thread.run(Thread.java:762)
迁移成功运行并且正在按照我的编写方式创建表,但是在房间升级数据库版本并迁移之后,每次单独的数据库访问操作都会出现该异常。升级后的每次读取或写入都会导致此异常
这个异常是静默发生的,它没有崩溃应用程序,也没有引用我的代码中的任何地方,它只是发生在Logcat中,并且在它发生的那一刻甚至一次都阻止了任何类型的DB访问。无论您是否已经提供了迁移代码,或者您是否想要回退到破坏性迁移,Room会检测到您升级了数据库,然后将其锁定并且只是阻止对它进行任何访问。
我在三星S6,Nexus 5,OnePlus,摩托罗拉Moto C和Google Pixel上测试了这个问题,到处都是同样的问题。
答案 0 :(得分:18)
我正在浏览此页面on adding Architecture Components to your app,我遇到了这条美丽的路线:
def room_version = "1.1.0" // or, for latest rc, use "1.1.1-rc1"
我当时正在使用Room版本 1.1.0 ,因为它应该是稳定的,我们需要稳定,可靠的软件,当然我们可以依赖Google。
将版本改为 1.1.1-rc1 ,我可以肯定地说,这个源于Google自己代码的荒谬错误现在已经消失,我已经重新测试了我在原始问题中提到的所有设备上的情况相同。
发生异常时要小心,不要提及您的代码。这是1.1.0会议室中的一个错误,请确认您是否已经看过它,我在网上看到的其他唯一提及is this one here from 2017