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

由于文件室中的唯一约束,数据库迁移失败

裘丰
2023-03-14

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

数据库模式

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;

    }

@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:TableInfo{name='task_detail', columns={id=Column{name='id', type='INTEGER', notNull=true, primaryKeyPosition=1}, detail=Column{name='detail', type='TEXT', notNull=true, primaryKeyPosition=0}}, foreignKeys=[], indices=[Index{name='detail', unique=true, columns=[detail]}]}

found:TableInfo{name='task_detail', columns={id=Column{name='id', type='INTEGER', notNull=true, primaryKeyPosition=1}, detail=Column{name='detail', type='TEXT', notNull=true, primaryKeyPosition=0}}, foreignKeys=[], indices=[]}

共有1个答案

武功
2023-03-14

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

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

与任务详情表相同

 类似资料:
  • 问题内容: 我试图在表中插入值。但是只插入一个值。尝试插入新值时,日志猫出现错误。 日志猫显示: 插入行时,这两行显示错误。 EventTableHelper 如何解决呢? 问题答案: 您的代码可能违反了字段上主键的唯一性约束。 两种可能的解决方案是: 确保您为每个对象返回唯一值。现在,我看不到您将任何标识符传递给其构造函数,并且可能所有事件都以相同的值插入。 如果您不希望自己生成ID,则可以将设

  • 我遇到一个情况,需要根据另一个列值对一个列[属性]强制执行唯一约束。 例如,我有一个像table(ID,EID,Name,ISDeleted)这样的表 ISDeleted只能有一个值null或'y'(active或deleted),并且我想在EID上创建一个唯一的约束,仅当ISDeleted=null时才创建ISDeleted,因为我不关心是否有多个具有相同ID的已删除记录。请注意,EID可以为空

  • 我有一个spring项目,想在数据库中强制一个字段的唯一性,并将错误消息返回给UI。 我已经阅读了这个SO答案,它是有意义的,所以@Col的(唯一=真)使表上的约束,但不强制它。 因此,问题变成了如何创建一个@Unique注释,该注释与数据库进行检查,并在POST处理程序上向BindingResult返回错误消息。 一个例子会很棒。 更新 我尝试了以下方法来制作自定义验证器: 对象(请注意,我添加

  • 我有一个用户创建屏幕,它记录了各种用户详细信息以及名字和手机号码。我有一个对应的用户表,其中名字和手机号码构成一个复合唯一键。此表中还定义了其他完整性约束。 当在创建用户屏幕上输入违反此约束的用户数据时,需要向用户显示“用户友好”错误消息。 当这种违反发生时,我从MySQL数据库中得到的异常是: 有两个选项可以显示有意义的消息(例如:“错误:给定手机号码的用户名已存在,请更改其中一个”)。 选项1

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

  • 问题内容: 我正在使用Django从Tango中学习Django,但是在输入时,我始终收到此错误: 这是输出: Models.py: 问题答案: 造成这种限制的原因可能是,在你最初迁移它时,在类中没有任何字段被调用(第一次迁移),并且在模型中添加了该字段之后,当你运行时,你已将默认值设置为静态值值(即或”等),并且打破了类别表的表段列的唯一约束,其中表段应该是唯一的,但这不是因为所有条目都将获得该