房间迁移:"no such table: room_table_modification_log"
Room migration: "no such table: room_table_modification_log"
房间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)
数据库初始化代码如下所示(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。
我该如何解决?
将版本升级到 1.1.1-rc1,这种源自 Google 自己的代码的荒谬错误将不会再发生,我已经在许多设备上测试了相同的场景。
另见我的
我修复了这个崩溃。
我的私钥类型和外键类型不相等,
设置相等类型后,不会发生崩溃
就我而言,当我使用 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()
房间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)
数据库初始化代码如下所示(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。 我该如何解决?
将版本升级到 1.1.1-rc1,这种源自 Google 自己的代码的荒谬错误将不会再发生,我已经在许多设备上测试了相同的场景。
另见我的
我修复了这个崩溃。 我的私钥类型和外键类型不相等,
设置相等类型后,不会发生崩溃
就我而言,当我使用 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()