对不起,如果这似乎是一个愚蠢的问题.我很喜欢编程(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)
这是我学到的东西和我遵循的步骤.我希望这可以帮助其他人这个神秘的错误消息.
顺便说一句 - 这就是我认为信息发生的原因.如果您的架构根据迁移完全不匹配,则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)