具有唯一索引的房间数据库迁移问题

Posted

技术标签:

【中文标题】具有唯一索引的房间数据库迁移问题【英文标题】:Room Database Migration Issue with Unique Index 【发布时间】:2019-07-23 09:12:17 【问题描述】:

我正在尝试升级我的数据库版本,在上一个版本中,该表具有在迁移室创建的唯一索引给我以下错误

预期:

TableInfoname='ALERT_STATUS', columns=resolution_time=Columnname='resolution_time', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, status=Columnname='status', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0, id=Columnname='id', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=1, event_time=Columnname='event_time', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, is_uploaded=Columnname='is_uploaded', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0, InvErrorCode=Columnname='InvErrorCode', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, is_fault=Columnname='is_fault', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0, FaultDetails=Columnname='FaultDetails', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, code=Columnname='code', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, component=Columnname='component', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=0, foreignKeys=[], indices=[Indexname='index_ALERT_STATUS_code_event_time', unique=true, columns=[code, event_time]]

找到:

TableInfoname='ALERT_STATUS', columns=resolution_time=Columnname='resolution_time', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, status=Columnname='status', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0, id=Columnname='id', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=1, event_time=Columnname='event_time', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, is_uploaded=Columnname='is_uploaded', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0, InvErrorCode=Columnname='InvErrorCode', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, is_fault=Columnname='is_fault', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0, FaultDetails=Columnname='FaultDetails', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, code=Columnname='code', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, component=Columnname='component', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=0, foreignKeys=[], indices=[Indexname='code_time', unique=true, columns=[code, event_time]]

我尝试删除唯一索引并且迁移工作正常,但使用唯一索引它从未通过

我的数据库实体在下面

    @Entity(tableName = "ALERT_STATUS" , indices = @Index(value = "code", "event_time",
    unique = true))

  public class AlertStatus implements Serializable
    @PrimaryKey(autoGenerate = true)
    public Integer id;

    @NonNull
    public String event_time;
    public String resolution_time;

    @NonNull
    public String code;
    public Integer component;
    public int status;
    public int is_fault;
    public String FaultDetails;
    public String InvErrorCode;
    public int is_uploaded;



    

【问题讨论】:

【参考方案1】:

试试这个对我有用。

    创建一个新表,即 Holder 表,它将在结构更改之间保存您的数据。

     database.execSQL("CREATE TABLE TABLE_NAME (id INTEGER, column1 varchar(25), column2 varchar(25) , PRIMARY KEY(id))");
    

    根据需要创建唯一索引

     database.execSQL("CREATE UNIQUE INDEX IF NOT EXISTS <index-name> ON TABLE_NAME (column1,column2)");
    

【讨论】:

以上是关于具有唯一索引的房间数据库迁移问题的主要内容,如果未能解决你的问题,请参考以下文章

用于创建表并在两个字段上添加唯一索引的 Rails 迁移文件在迁移期间似乎被忽略了

Fluent Api 未创建完全正确的迁移文件内容,因此不会将唯一索引应用于数据库

如何在 Ruby on Rails 迁移中使列唯一并为其编制索引?

创建索引时,具有 mysql 数据库迁移的实体框架失败

桌子上的房间异常:预打包的数据库具有无效的架构

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