小编Fre*_*eng的帖子

Android Room SQLite数据迁移 - 尝试重新打开已经关闭的对象

对不起,如果这似乎是一个愚蠢的问题.我很喜欢编程(3周).我添加了一个新的Membership表,并编写了从v3到4的迁移,但它似乎不起作用.我列出了新表,用于迁移的代码以及我收到的错误消息.我花了几个小时尝试不同的事情.如果有人能指出我正确的方向,那将非常感激.为糟糕的格式提前道歉.任何有帮助的人都会得到令人敬畏的业力.

更新 - 固定!

我终于弄明白了.这是我的迁移.

database.execSQL("CREATE TABLE Membership (mID INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, mName TEXT, mBarcode TEXT, mType TEXT);");
Run Code Online (Sandbox Code Playgroud)

这是我学到的东西和我遵循的步骤.我希望这可以帮助其他人这个神秘的错误消息.

  1. 使用Android SDK平台工具生成模拟器 - adb root
  2. adb pull /data/user/0/com.xxxx/databases/workout-database.db
  3. 使用DB Browser for SQLite打开数据库文件,以了解Room所做的CREATE TABLE语句
  4. 在创建声明中,Room会做一些"额外"的事情.所有INTEGERS都不是NULL,将ADID AUTOINCREMENT添加到PRIMARY KEY,十进制数是REAL NOT NULL.

顺便说一句 - 这就是我认为信息发生的原因.如果您的架构根据迁移完全不匹配,则Room会恢复为原始版本并关闭数据库以保护它.然后当它试图在程序中的某个地方再次访问它时,它会因重新打开一个已关闭的数据库错误而失败.这只是猜测,但我认为它有点像这样.基本上修复您的迁移,一切都很好.另一种尝试理解Room如何创建数据库的方法,您可以尝试解密您的Database类实现(单击Database类中抽象Dao语句左侧的绿色按钮).

错误日志

E/AndroidRuntime: FATAL EXCEPTION: main Process: com.xxxx, PID: 5343
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.xxxx/com.xxxx.MainActivity}: java.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteDatabase: /data/user/0/com.xxxx/databases/workout-database
                  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2984)
                  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3045)
                  at android.app.ActivityThread.-wrap14(ActivityThread.java)
                  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1642)
                  at android.os.Handler.dispatchMessage(Handler.java:102)
                  at android.os.Looper.loop(Looper.java:154)
                  at …
Run Code Online (Sandbox Code Playgroud)

java migration sqlite android android-room

5
推荐指数
1
解决办法
1880
查看次数

标签 统计

android ×1

android-room ×1

java ×1

migration ×1

sqlite ×1