由于房间中的唯一约束,数据库迁移失败
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
表相同
【讨论】:
以上是关于由于房间中的唯一约束,数据库迁移失败的主要内容,如果未能解决你的问题,请参考以下文章