当前位置: 首页 > 知识库问答 >
问题:

房间自动迁移不起作用:新表(实体)出现致命异常

谭锐藻
2023-03-14

尝试为新实体/表使用自动迁移后,我发现了此错误。

E/AndroidRuntime: FATAL EXCEPTION: main
Process: net.sharetrip.b2b, PID: 8861
java.lang.IllegalStateException: Migration didn't properly handle: QuickPassenger(net.sharetrip.b2b.view.more.model.QuickPassenger).
 Expected:
TableInfo{name='QuickPassenger', columns={passportNumber=Column{name='passportNumber', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, lastName=Column{name='lastName', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, wheelChair=Column{name='wheelChair', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, gender=Column{name='gender', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, mealPreference=Column{name='mealPreference', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, mobileNumber=Column{name='mobileNumber', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, dateOfBirth=Column{name='dateOfBirth', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, firstName=Column{name='firstName', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, seatPreference=Column{name='seatPreference', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, titleName=Column{name='titleName', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, nationality=Column{name='nationality', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, defaultValue='null'}, frequentFlyerNumber=Column{name='frequentFlyerNumber', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, passportCopy=Column{name='passportCopy', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, passportExpireDate=Column{name='passportExpireDate', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, id=Column{name='id', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=1, defaultValue='null'}, visaCopy=Column{name='visaCopy', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, travellerType=Column{name='travellerType', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, email=Column{name='email', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}}, foreignKeys=[], indices=[]}
 Found:
TableInfo{name='QuickPassenger', columns={}, foreignKeys=[], indices=[]}
    at androidx.room.RoomOpenHelper.onUpgrade(RoomOpenHelper.java:103)

迁移发生时,似乎找不到任何列。我声明我的完整性如下。

@Entity
data class QuickPassenger(
    @PrimaryKey
    @ColumnInfo(name = "id")
    var id: String,
    var titleName: String?,
    var firstName: String?,
    var lastName: String?,
    var gender: String? = Gender.male,
    var nationality: String = "BD",
    var dateOfBirth: String?,
    var passportNumber: String?,
    var frequentFlyerNumber: String?,
    var passportExpireDate: String?,
    var seatPreference: String?,
    var mealPreference: String?,
    var wheelChair: String?,
    var passportCopy: String?,
    var visaCopy: String?,
    val travellerType: String?,
    val email: String?,
    val mobileNumber: String?
)

我用的是2.4.0-alpha04版本的room for all

androidx.room:room-compiler 
androidx.room:room-ktx
androidx.room:room-runtime. 

任何帮助都非常感谢。

共有1个答案

艾俊悟
2023-03-14

它与数据库版本和架构相关。创建实体(或其他数据库架构更改)后,如果在不增加数据库版本或定义自动迁移的情况下生成并运行项目,则应用数据库可能会损坏。
因此,您需要增加数据库版本(例如,从 v1 增加到 v2)并首先定义自动迁移(作为文档),然后生成并运行项目。
在你的情况下(应用数据库可能已损坏),我建议你卸载应用,回滚(或存储)更改,运行项目,再次应用所有实体创建和自动迁移内容,然后重新运行项目。
但在重新运行之前,请确保您的旧数据库架构文件未更改(查找文件 1.json 作为我的示例)。相反,通过增加数据库版本并重新运行项目,应该自动生成新的数据库架构文件(查找文件 2.json 作为我的示例)。

注意)官方的Google docs可能已经过时了(撰写本文时就是这种情况!),所以我可以提供这篇关于房间自动迁移的文章。

 类似资料:
  • 错误:java.lang.IllegalStateException:迁移未正确处理:insta_alerts(org.altruist.bajajexperia.models.ceInstaViewDetailSDTo)。 预期:

  • 如果运行,它会失败 未找到基表或视图:1146表*.迁移不存在。 数据库是空的。 如果我运行我会看到迁移表,但它是空的。 DB显示迁移表,但它是空的。 如果我再次运行,数据库再次为空,我会得到相同的错误: 未找到基表或视图:1146表*.迁移不存在。 也许有人知道这里发生了什么。

  • 我在stackoverflow中搜索了一个类似的问题,但没有找到,不同情况下的其他可能解决方案也不适合我。我打开这个问题是因为我找不到这个问题的解决方案,也找不到这个问题的类似问题。 我尝试过使用Android Room的自动迁移功能,但它从未正常工作。 目前的情况如下: 我有一个数据库版本1 我想向一个表添加一个新列,这是我想做的唯一修改。此列将保存字符串值,而不保存其他任何内容。 此新列将仅存

  • 找到:TableInfo{name='news',Columns={alias=Column{name='alias',Type='text',affinity='2',notnull=false,PrimaryKeyPosition=0,DefaultValue='null'},Selected=Column{name='select',Type='integer',affinity='3',n

  • 并且我发现了基于数据库版本4的可能场景的迁移varargs。 我的问题是,假设我使用的是db v1的Room,当我的应用程序到达db v10时,我将不得不编写多少迁移方法? 在sqlite中,我们在中获得已安装应用程序的当前db版本,我们只需通过开关大小写而不使用break语句,以便满足所有db升级。

  • 我想将我的项目迁移到空安全,但是dependecie不支持空安全: