由于房间中的唯一约束,数据库迁移失败

Posted

技术标签:

【中文标题】由于房间中的唯一约束,数据库迁移失败【英文标题】:Database Migration Failed due to unique constraint in room 【发布时间】:2018-05-21 04:44:29 【问题描述】:

我在旧数据库中的一张表中有唯一约束。 在迁移到房间时,我按照 [link][1] 上的说明创建了新表,并在“TaskDetail”实体类中使用“indices”关键字应用了唯一约束。 并提供空迁移。在运行迁移测试时,我收到与唯一约束相关的错误,如下所述。 我做错什么了吗??

数据库架构

String CREATE_TABLE_TASK = "CREATE TABLE IF NOT EXISTS "+TASK+
            " (`task_id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT," +
            "`task_note` TEXT," +
            "`status` INTEGER NOT NULL)";


    String CREATE_TABLE_TASK_DETAIL = "CREATE TABLE IF NOT EXISTS "+TASK_DETAIL+
            " (`id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT," +
            "`detail` TEXT NOT NULL UNIQUE)";

房间实体表

@Entity(tableName = "task_master")
        public class Task 

            @ColumnInfo(name = "task_id")
            @PrimaryKey(autoGenerate = true)
            @NonNull
            private int taskId;

            @ColumnInfo(name = "task_note")
            private String task;

            private @TaskStatus
            int status;

        

//TOKEN DETAIL TABLE
@Entity(tableName = "task_detail",indices =@Index(name = "detail",value = "detail",unique = true))
    public class TaskDetail 

        @PrimaryKey(autoGenerate = true)
        private int id;

        @NonNull
        private String detail;

    

RoomDatabase 类

@Database(entities = Task.class, TaskDetail.class,version = 2,exportSchema = true)
public abstract class AppDatabase extends RoomDatabase

    private static final Object sObject = new Object();
    private static AppDatabase sInstance;

    public abstract TaskDao getTaskDao();

    public static AppDatabase getInstance(Context context)

        if(sInstance == null)
            synchronized (sObject)
                if(sInstance == null)
                    sInstance = Room.databaseBuilder(context,AppDatabase.class,"task.db")
                            .allowMainThreadQueries()
                            .build();
                
            
        
        return sInstance;
    

错误

expacted:TableInfoname='task_detail', columns=id=Columnname='id', type='INTEGER', notNull=true, primaryKeyPosition=1, detail=Columnname='detail', type='TEXT', notNull=true, primaryKeyPosition=0, foreignKeys=[], indices=[Indexname='detail', unique=true, columns=[detail]]

found:TableInfoname='task_detail', columns=id=Columnname='id', type='INTEGER', notNull=true, primaryKeyPosition=1, detail=Columnname='detail', type='TEXT', notNull=true, primaryKeyPosition=0, foreignKeys=[], indices=[]

【问题讨论】:

这里有类似的错误,使用完全相同的 db 文件,但我的是预期的:indices=[],发现:indices=null 【参考方案1】:

您必须为您的表定义 unix 索引。对于task_master,如果您的唯一键是task_id,请添加如下内容:

database.execSQL("CREATE UNIQUE INDEX `index_task_master_task_id` ON `task_master` (`task_id`)");

task_detail 表相同

【讨论】:

以上是关于由于房间中的唯一约束,数据库迁移失败的主要内容,如果未能解决你的问题,请参考以下文章

添加表格时房间迁移失败

添加索引迁移中的唯一性被忽略

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

:完整性约束违规:1452 无法添加或更新子行:laravel 迁移中的外键约束失败

Laravel 5 迁移 - 外键约束失败

如何编写迁移来撤消Laravel中的唯一约束?