房间迁移:“没有这样的表:room_table_modification_log”

Posted

技术标签:

【中文标题】房间迁移:“没有这样的表:room_table_modification_log”【英文标题】:Room migration: "no such table: room_table_modification_log" 【发布时间】:2018-10-26 11:54:51 【问题描述】:

房间 1.1.0 版本。

我在迁移后第一次运行时遇到此错误。

如果我关闭应用程序并重新启动它,它运行良好。

ROOM: Cannot run invalidation tracker. Is the db closed?
java.lang.IllegalStateException: Cannot perform this operation because the connection pool has been closed.
    at android.database.sqlite.SQLiteConnectionPool.throwIfClosedLocked(SQLiteConnectionPool.java:1182)
    at android.database.sqlite.SQLiteConnectionPool.waitForConnection(SQLiteConnectionPool.java:792)
    at android.database.sqlite.SQLiteConnectionPool.acquireConnection(SQLiteConnectionPool.java:518)

Caused By : SQL(query) error or missing database.
    (no such table: room_table_modification_log (code 1): , while compiling: DELETE FROM proposals WHERE hotel_id = ?)
#################################################################
    at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
    at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:1095)
    at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:660)
    at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
    at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:59)
    at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31)
    at android.database.sqlite.SQLiteDatabase.compileStatement(SQLiteDatabase.java:1417)
    at android.arch.persistence.db.framework.FrameworkSQLiteDatabase.compileStatement(FrameworkSQLiteDatabase.java:64)
    at android.arch.persistence.room.RoomDatabase.compileStatement(RoomDatabase.java:244)
    at android.arch.persistence.room.SharedSQLiteStatement.createNewStatement(SharedSQLiteStatement.java:65)
    at android.arch.persistence.room.SharedSQLiteStatement.getStmt(SharedSQLiteStatement.java:77)
    at android.arch.persistence.room.SharedSQLiteStatement.acquire(SharedSQLiteStatement.java:87)
    at com.hotellook.db.dao.FavoritesDao_Impl.removeProposals(FavoritesDao_Impl.java:723)

DB初始化代码如下(Dagger AppModule)

@Provides
@Singleton
fun provideDataBase(app: Application): AppDatabase =
  Room.databaseBuilder(app, AppDatabase::class.java, DATABASE_NAME)
      .addMigrations(MIGRATION_1_2)
      .addMigrations(MIGRATION_2_3)
      .build()

private companion object 
  const val DATABASE_NAME = "app.db"

  val MIGRATION_1_2 = object : Migration(1, 2) 
    override fun migrate(database: SupportSQLiteDatabase) 
      database.execSQL("ALTER TABLE table1 ADD COLUMN column0 TEXT;")
      database.execSQL("ALTER TABLE table2 ADD COLUMN column0 TEXT;")
    
  

  val MIGRATION_2_3 = object : Migration(2, 3) 
    override fun migrate(database: SupportSQLiteDatabase) 
      database.execSQL("CREATE TABLE table0 (column1 INTEGER NOT NULL, column2 TEXT NOT NULL, PRIMARY KEY(column1))")
      database.execSQL("ALTER TABLE table1 ADD COLUMN column1 TEXT;")
      database.execSQL("ALTER TABLE table1 ADD COLUMN column2 TEXT;")
      database.execSQL("ALTER TABLE table1 ADD COLUMN column3 REAL;")
      database.execSQL("ALTER TABLE table2 ADD COLUMN column1 TEXT;")
      database.execSQL("ALTER TABLE table2 ADD COLUMN column2 REAL;")
      database.execSQL("ALTER TABLE table3 ADD COLUMN column1 INTEGER DEFAULT 0;")
      database.execSQL("ALTER TABLE table3 ADD COLUMN column2 TEXT;")
    
   

应用程序从版本 2 升级到 3。 我该如何解决?

【问题讨论】:

请添加MIGRATION_1_2MIGRATION_2_3 完成。只有 MIGRATION_2_3 很重要,因为应用程序正在从版本 2 更新到 3。 【参考方案1】:

将版本升级到 1.1.1-rc1,这种源自 Google 自己的代码的荒谬错误将不再发生,我已经在许多设备上测试了相同的场景。

另见我的question/answer here

【讨论】:

升级到 1.1.1-rc1 可能会解决这个问题。这是关于这个问题的bug。 Room 2.x 怎么样? 如果它基于 1.1.1-rc1 及更高版本,那么显然它会工作 如果它在 1.1.1 之前分支并且他们没有将修复移植到 2.0 分支,那么它不会。由于我们没有来源,我们看不到解决问题的提交,而且我们没有(AFAIK)从谷歌得到任何反馈(甚至确认),所以我们无法判断。我在 2.0.0-alpha 上遇到这个问题已经有一段时间了,所以我猜你的“显然”不是明显的。 我在 2.2.5 中面临同样的崩溃【参考方案2】:

我修复了这个崩溃。 我的私钥类型和外键类型不相等,

设置相等类型后,不会发生崩溃

【讨论】:

【参考方案3】:

在我的情况下,当我使用 LiveData 并在创建 RoomDatabse 实例时覆盖 onOpen(db: SupportSQLiteDatabase) 时,我因这个错误而失败

Room.databaseBuilder(context.applicationContext, AppDatabase::class.java, DATABASE_NAME)
            .addMigrations(MIGRATION_1_2)
            .addCallback(object : Callback() 
                override fun onCreate(db: SupportSQLiteDatabase) 
                    super.onCreate(db)
                    initTypeDataFirstTime(context)
                

                override fun onOpen(db: SupportSQLiteDatabase) 
                    super.onOpen(db)
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) 
                        db.disableWriteAheadLogging()
                    
                
            )
                .build()

【讨论】:

以上是关于房间迁移:“没有这样的表:room_table_modification_log”的主要内容,如果未能解决你的问题,请参考以下文章

Android房间迁移null错误

添加表格时房间迁移失败

迁移房间数据库时有没有办法使用迁移期间计算的变量?

由于房间中的唯一约束,数据库迁移失败

在 Android 中使用房间数据库写入迁移的查询错误

Android 房间迁移测试失败,但没有任何改变