将房间数据库中的唯一约束添加到多列

Kev*_*van 19 sqlite android database-design android-room android-architecture-components

我在房间里有一个实体

@Entity(foreignKeys ={
        @ForeignKey(entity = Label.class, parentColumns = "_id", childColumns = "labelId", onDelete = CASCADE),
        @ForeignKey(entity = Task.class, parentColumns = "_id", childColumns = "taskId", onDelete = CASCADE)
})
public class LabelOfTask extends Data{
    @ColumnInfo(name = "labelId")
    private Integer labelId;
    @ColumnInfo(name = "taskId")
    private Integer taskId;
}
Run Code Online (Sandbox Code Playgroud)

这个实体的sql语法如下

CREATE TABLE `LabelOfTask` (
    `_id` INTEGER PRIMARY KEY AUTOINCREMENT,
     `labelId` INTEGER,
     `taskId` INTEGER,
     FOREIGN KEY(`labelId`) REFERENCES `Label`(`_id`) ON UPDATE NO ACTION ON DELETE CASCADE ,
     FOREIGN KEY(`taskId`) REFERENCES `Task`(`_id`) ON UPDATE NO ACTION ON DELETE CASCADE
 );
Run Code Online (Sandbox Code Playgroud)

但是如果我想在下面的约束下追加到表的自动生成的sql架构,我需要在实体类中添加什么更改或注释

unique (labelId, taskId)
Run Code Online (Sandbox Code Playgroud)

最后,我想使用房间库在table(或房间的实体)中将labelId和taskId组合成唯一.

lib*_*ib4 26

除了通过索引之外,不支持列上的普通UNIQUE约束.

您可以通过将@Index注释的unique属性设置为true来强制实施此唯一性属性.以下代码示例可防止表包含两行,这些行包含firstName和lastName列的相同值集:

@Entity(indices = {@Index(value = {"first_name", "last_name"},
        unique = true)})
class User {
    @PrimaryKey
    public int id;

    @ColumnInfo(name = "first_name")
    public String firstName;

    @ColumnInfo(name = "last_name")
    public String lastName;

    @Ignore
    Bitmap picture;
}
Run Code Online (Sandbox Code Playgroud)

在您的代码中,您可以执行以下更改以获得UNIQUE约束

@Entity(indices = arrayOf(Index(value = ["first_name", "last_name"], unique = true)))
Run Code Online (Sandbox Code Playgroud)

  • 将单个属性设置为UNIQUE怎么样? (4认同)
  • 你好!如果您尝试添加第二个相同的值会发生什么? (2认同)

Erc*_*can 7

如果您想使单个列具有唯一性,只需编写

@Entity(indices = {@Index(value = "name", unique = true)})
Run Code Online (Sandbox Code Playgroud)


Mas*_*sum 6

对于单列唯一性

@Entity(indices = {@Index(value = {"first_name"},unique = true)})
Run Code Online (Sandbox Code Playgroud)

对于多列唯一性

@Entity(indices = {@Index(value = {"first_name", "last_name"},unique = true)}) 
Run Code Online (Sandbox Code Playgroud)