具有 UNIQUE KEY 约束的房间迁移不起作用

问题描述

错误java.lang.IllegalStateException:迁移没有正确处理:insta_alerts(org.altruist.BajajExperia.Models.CEInstaViewDetailsDTO)。

预期:

TableInfo{name='insta_alerts',columns={isSeen=Column{name='isSeen',type='INTEGER',affinity='3',notNull=false,primaryKeyPosition=0, defaultValue='null'},smsText=Column{name='smsText',type='TEXT',亲和性='2',notNull=false,primaryKeyPosition=0, defaultValue='null'},sentDate=Column{name='sentDate',亲和性='2',notNull=false,primaryKeyPosition=0, defaultValue='null'},campaign=Column{name='campaign',type='TEXT', 亲和性='2',notNull=false,primaryKeyPosition=0, defaultValue='null'},customerId=Column{name='customerId', type='TEXT',affinity='2',notNull=false,primaryKeyPosition=0, defaultValue='null'},id=Column{name='id',type='INTEGER',亲和性='3',notNull=false,primaryKeyPosition=1, defaultValue='null'},header=Column{name='header',亲和性='2',notNull=false,primaryKeyPosition=0, defaultValue='null'},priority=Column{name='priority',type='TEXT', 亲和性='2',notNull=false,primaryKeyPosition=0, defaultValue='null'},notificationText=Column{name='notificationText', type='TEXT',affinity='2',notNull=false,primaryKeyPosition=0, defaultValue='null'},alertMessage=Column{name='alertMessage', type='TEXT',affinity='2',notNull=false,primaryKeyPosition=0, defaultValue='null'}},外键=[], 指数=[索引{name='index_insta_alerts_smsText_customerId', unique=true,columns=[smsText,customerId]}]}

找到:

TableInfo{name='insta_alerts',亲和性='2',notNull=false,primaryKeyPosition=0, defaultValue='null'},priority=Column{name='priority',type='TEXT', 亲和性='2',notNull=false,primaryKeyPosition=0, defaultValue='null'},notificationText=Column{name='notificationText', type='TEXT',affinity='2',notNull=false,primaryKeyPosition=0, defaultValue='null'},alertMessage=Column{name='alertMessage', type='TEXT',affinity='2',notNull=false,primaryKeyPosition=0, defaultValue='null'}}、foreignKeys=[]、indices=[]}

查询

database.execsql("CREATE TABLE IF NOT EXISTS insta_alerts(id INTEGER PRIMARY KEY,campaign TEXT,notificationText TEXT,header TEXT,alertMessage TEXT,priority TEXT,sentDate TEXT,smsText TEXT,customerId TEXT,isSeen INTEGER,CONSTRAINT index_insta_alerts_smsText_customerId UNIQUE(smsText,customerId) ON CONFLICT REPLACE)")

型号:

@Entity(
    tableName = "insta_alerts",indices =
    [Index(
        value = ["smsText","customerId"],unique = true
    )]
)
@Parcelize
data class CEInstaViewDetailsDTO(
    @PrimaryKey(/*autoGenerate = true*/)
    @ColumnInfo(name = "id")
    @Serializedname("id")
    var id: Long? = null,@ColumnInfo(name = "campaign")
    @Serializedname("campaign")
    var campaign: String? = null,@ColumnInfo(name = "notificationText")
    @Serializedname("notificationText")
    var notificationText: String? = null,@ColumnInfo(name = "header")
    @Serializedname("header")
    var header: String? = null,@ColumnInfo(name = "alertMessage")
    @Serializedname("alertMessage")
    var alertMessage: String? = null,@ColumnInfo(name = "priority")
    @Serializedname("priority")
    var priority: String? = null,@ColumnInfo(name = "sentDate")
    @Serializedname("sentDate")
    var sentDate: String? = null,@ColumnInfo(name = "smsText")
    @Serializedname("smsText")
    var smsText: String? = null,@ColumnInfo(name = "customerId")
    @Serializedname("customerId")
    var customerId: String? = null,@ColumnInfo(name = "isSeen")
    @Serializedname("isSeen")
    var isSeen: Int? = null
) : Parcelable

解决方法

您应该将索引创建添加到迁移中,例如

database.execSQL("CREATE UNIQUE INDEX IF NOT EXISTS index_insta_alerts_smsText_customerId ON insta_alerts (smsText,customerId)")