android - Android + Room + 尝试重新打开已经关闭的对象:SQLiteDatabase: - 添加迁移后
问题描述
我已经为我的一个 android 应用程序添加了 Romm 数据库库,并在一段时间内正确使用它,但现在我必须更新应用程序,并且我想将数据库迁移添加到它。
我为此关注了多个教程、博客和官方文档,并尝试添加迁移。
但是,当我尝试添加数据库迁移时,即使添加了多个版本的迁移,我也会遇到相同的错误,例如,
java.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteDatabase: (database path)
这是迁移的代码。
val MIGRATION_4_5: Migration = object : Migration(4, 5) {
override fun migrate(database: SupportSQLiteDatabase) {
// database.execSQL("ALTER TABLE timetracker ADD COLUMN tempId TEXT")
// 1. Create new table
database.execSQL("CREATE TABLE timetrackerTemp (
contentId INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
time INTEGER, tempId TEXT );")
// 2. Copy the data
database.execSQL("INSERT INTO timetrackerTemp (
contentId, time, tempId ) SELECT contentId, time,
tempId FROM timetracker")
// 3. Remove the old table
database.execSQL("DROP TABLE timetracker")
// 4. Change the table name to the correct one
database.execSQL("ALTER TABLE timetrackerTemp RENAME TO timetracker")
}
}
这是获取数据库对象的代码,
daoInstance = Room.databaseBuilder(this, AppDatabase::class.java, "myapp.db")
.allowMainThreadQueries()
.addMigrations(AppDatabase.MIGRATION_4_5)
.build()
如果有人有任何想法,请提供帮助。
崩溃日志,
E/AndroidRuntime:致命异常:主要 java.lang.RuntimeException:无法暂停活动 {com.example.dev/com.example.content.appview.content.ContentActivity}:java.lang.IllegalStateException:尝试重新打开已经关闭的对象:SQLiteDatabase:/data/user/0/com.example.dev/databases/test.db at android.app.ActivityThread.performPauseActivityIfNeeded(ActivityThread.java:3746) at android.app.ActivityThread.performPauseActivity(ActivityThread .java:3712) 在 android.app.ActivityThread.performPauseActivity(ActivityThread.java:3686) 在 android.app.ActivityThread.handlePauseActivity(ActivityThread.java:3660) 在 android.app.ActivityThread.-wrap16(ActivityThread.java) 在android.os.Handler 上的 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1485)。dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6123) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:757) 引起:java.lang.IllegalStateException :尝试重新打开一个已经关闭的对象:SQLiteDatabase: /data/user/0/com.example.dev/databases/test.db at android.database.sqlite.SQLiteClosable.acquireReference(SQLiteClosable.java:55) at android.database.sqlite.SQLiteDatabase.executeSql(SQLiteDatabase.java:1660) 在 android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1606) 在 android.arch.persistence.db。framework.FrameworkSQLiteDatabase.execSQL(FrameworkSQLiteDatabase.java:242) 在 com.example.base.database.AppDatabase$Companion$MIGRATION_4_5$1.migrate(AppDatabase.kt:40) 在 android.arch.persistence.room.RoomOpenHelper.onUpgrade(RoomOpenHelper .java:85) 在 android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:256) 在 android.database. sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:163) 在 android.arch.persistence.db.framework.FrameworkSQLiteOpenHelper$OpenHelper.getWritableSupportDatabase(FrameworkSQLiteOpenHelper.java:96) 在 android.arch.persistence.db.framework.FrameworkSQLiteOpenHelper。getWritableDatabase(FrameworkSQLiteOpenHelper.java:54) at android.arch.persistence.room.RoomDatabase.query(RoomDatabase.java:233) at com.example.base.database.daos.TimeTrackerContentDao_Impl.getAll(TimeTrackerContentDao_Impl.java:134) at com .example.content.appview.content.ContentActivity.onPause(ContentActivity.kt:600) 在 android.app.Activity.performPause(Activity.java:6812) 在 android.app.Instrumentation.callActivityOnPause(Instrumentation.java:1344) 在android.app.ActivityThread.performPauseActivityIfNeeded(ActivityThread.java:3735) 在 android.app.ActivityThread.performPauseActivity(ActivityThread.java:3712) 在 android.app.ActivityThread.performPauseActivity(ActivityThread.java:3686) 在 android.app.ActivityThread .handlePauseActivity(ActivityThread.java:3660) 在 android.app.ActivityThread.-wrap16(ActivityThread.java) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1485) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android .os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6123) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os .ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:757)154) 在 android.app.ActivityThread.main(ActivityThread.java:6123) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:第867章)154) 在 android.app.ActivityThread.main(ActivityThread.java:6123) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:第867章)
提前致谢。
解决方案
您必须尝试两件事才能找到解决方案:
表名和列名应写为
`table_name`,`column_name`
;使用运算符NOT NULL时应写入DEFAULT 值
前任。
ALTER TABLE `card` ADD COLUMN `status` INTEGER DEFAULT 0 NOT NULL
推荐阅读
- json - How to base an inner NgFor on the outter NgFor in Angular
- vue.js - 仅当组件已在 Vue.js 中导入时才加载样式
- java - 为什么 Kotlin 使用 == 表示结构相等并引入 === 表示引用相等
- java - How to memoize recursive path of length n search
- docker - Docker swarm DNS only returns services on local mode
- linux - Python SMTP function sending .txt file as .bin file-type
- python - Google App Engine 找不到 django 项目的静态文件,以及我的网站所依赖的 .txt 文件
- sql - 数据库中的表类型列
- php - PATCH 方法和 CORS 预检请求存在问题
- bash - 自动截断 bash 中的长输出