【发布时间】:2023-01-31 22:26:56
【问题描述】:
我想对我的房间数据库做一个简单的更改:添加一个新表。
我的房间版本是:2.4.1
根据 https://medium.com/androiddevelopers/room-auto-migrations-d5370b0ca6eb 的说法,使用自动迁移应该可以轻松完成此任务。
这是我的数据库类的相关部分在迁移之前的样子:
@Database(
entities = [FlashCard::class, Pool::class],
version = 2
)
abstract class DB : RoomDatabase() {
...
对于迁移,我将该部分更改为:
@Database(
entities = [FlashCard::class, Pool::class, FlashCardRunEvent::class],
version = 3,
autoMigrations = [
AutoMigration (from = 2, to = 3)
]
)
abstract class DB : RoomDatabase() {
...
一切都很好。该应用程序一直运行到与数据库第一次交互为止。
然后,应用程序崩溃了,我在我的日志中得到了这个:
Caused by: java.lang.IllegalStateException: Migration didn't properly handle: FlashCardRunEvent(com.ravenala.flashy.room.FlashCardRunEvent).
Expected:
TableInfo{name='FlashCardRunEvent', columns={newBox=Column{name='newBox', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0, defaultValue='null'}, flashCardId=Column{name='flashCardId', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0, defaultValue='null'}, timeStampInSeconds=Column{name='timeStampInSeconds', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0, defaultValue='null'}, id=Column{name='id', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=1, defaultValue='null'}, oldBox=Column{name='oldBox', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0, defaultValue='null'}}, foreignKeys=[], indices=[]}
Found:
TableInfo{name='FlashCardRunEvent', columns={}, foreignKeys=[], indices=[]}
我不知道该怎么做。 “预期”和“发现”之间的区别是什么?我曾希望 room 只会看到新表,从中生成一个方案并创建表。像这样写简单迁移的SQL语句的时代还没有结束吗?
【问题讨论】:
标签: android android-room