Android+Room+尝试重新打开一个已经关闭的对象:SQLiteDatabase:-添加迁移后



我已经为我的一个android应用程序添加了Romm数据库库,并在一段时间内正确使用它,但现在我必须更新该应用程序,我想将数据库迁移添加到它中。

我已经学习了多个教程、博客和官方文档,并尝试添加迁移。

然而,当我尝试添加DB迁移时,即使在添加了多个版本的迁移后,我也会遇到同样的错误,比如,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:致命异常:mainjava.lang.RuntimeException:无法暂停活动{com.example.dev.example.content.appview.content.ContentActivity}:java.lang.IllegalStateException:尝试重新打开已关闭的对象:SQLiteDatabase:/data/user/0/com.example.dev/database/test.db在android.app.ActivityThread.performPauseActivityIfNeeded(ActivityThreads.java:3746(在android.app.ActivityThread.performPauseActivity(ActivityThreads.java:3712(在android.app.ActivityThread.performPauseActivity上(ActivityThreads.java:3686(在android.app.ActivityThread.handlePouseActivity(ActivityThreads.java:3660(在android.app.ActivityThread.-wrap16(ActivityThreads.java(在android.app.ActivityThread$H.handleMessage(ActivityThreads.java:1485(在android.os.Handler.dispatchMessage(Handler.java:102(在android.os.Looper.loop(Looper.java:154(在android.app.ActivityThread.main(ActivityThreads.java:6123(位于java.lang.reflect.Method.ioke(本机方法(网址:com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867(网址:com.android.internal.os.ZygoteInit.main(ZygoteNit.java:757(引起原因:java.lang.IollegalStateException:试图重新打开已关闭的对象:SQLiteDatabase:/data/user/0.com.cn.exe.dev/databases/test.db在android.database.sqlite.SQLiteClosable.acquisiteReference(SQLiteClosaable.java:55(在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$Compnion$MIGRATION_4_5$1.migrate(AppDatabase.kt:40(在android.arch.persistence.room.RoomOpenHelper.onUpgrade(RoomOpenHelpr.java:85(在android.arch.pristence.db.framework.FrameworkSQLiteOpenHelper$OpenHelper.onUpgrade(FrameworkSQLiteOpenHelper.java:133(在android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelpr.java:256(在android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelpr.java:163(在android.arch.pristence.db.framework.FrameworkSQLiteOpenHelper$OpenHelper.getWritableSupportDatabase(FrameworkSQLiteOpenHelper.java:96(在android.arch.persistence.db.framework.FrameworkSQLiteOpenHelper.getWritableDatabase(FrameworkSQLiteOpenHelper.java:54(位于android.arch.persistence.room.RoomDatabase.query(RoomDatabase.java:233(在com.example.base.database.daos.TimeTrackerContentDao_Impl.getAll(TimeTrackerCntentDao_Impl.java:134(网址: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(ActivityThreads.java:3735(在android.app.ActivityThread.performPauseActivity(ActivityThreads.java:3712(在android.app.ActivityThread.performPauseActivity上(ActivityThreads.java:3686(在android.app.ActivityThread.handlePouseActivity(ActivityThreads.java:3660(在android.app.ActivityThread.-wrap16(ActivityThreads.java(在android.app.ActivityThread$H.handleMessage(ActivityThreads.java:1485(在android.os.Handler.dispatchMessage(Handler.java:102(在android.os.Looper.loop(Looper.java:154(在android.app.ActivityThread.main(ActivityThreads.java:6123(位于java.lang.reflect.Method.ioke(本机方法(网址:com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867(网址:com.android.internal.os.ZygoteInit.main(ZygoteNit.java:757(

提前感谢。

请确保数据库架构也已更改为5

@[Database(
entities = [
/* ... */
],
version = 5
)

您必须尝试两件事才能获得解决方案:

  • 表名列名应写成`table_name`,`column_name`

  • 使用运算符NOT NULL时应写入DEFAULT值

    Ex。ALTER TABLE `card` ADD COLUMN `status` INTEGER DEFAULT 0 NOT NULL

最新更新