将房间数据库中的唯一约束添加到多列
add unique constraint in room database to multiple column
我房间里只有一个实体
@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;
}
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
);
但是如果我想将以下约束附加到 table
的自动生成的 sql 架构中,我需要在实体 class 中添加哪些更改或注释
unique (labelId, taskId)
最终我想使用房间库使 labelId 和 taskId 的组合在 table(或房间实体)中是唯一的。
不支持对列的普通 UNIQUE 约束,而不是通过索引。
您可以通过将 @Index 注释的唯一性 属性 设置为 true 来强制执行此唯一性 属性。以下代码示例 (Java) 防止 table 有两行包含 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;
}
注释的 Kotlin 等价物如下:
@Entity(indices = [Index(value = ["first_name", "last_name"], unique = true)])
在您的代码中,您可以进行以下更改以获得唯一约束
@Entity(foreignKeys ={
@ForeignKey(entity = Label.class, parentColumns = "_id", childColumns = "labelId", onDelete = CASCADE),
@ForeignKey(entity = Task.class, parentColumns = "_id", childColumns = "taskId", onDelete = CASCADE)},
indices = {@Index(value = {"labelId", "taskId"},
unique = true)}
)
public class LabelOfTask extends Data{
@ColumnInfo(name = "labelId")
private Integer labelId;
@ColumnInfo(name = "taskId")
private Integer taskId;
}
如果想使单个列唯一,只需要写
@Entity(indices = [Index(value = ["name"], unique = true)])
对于单列唯一性
@Entity(indices = {@Index(value = {"first_name"},unique = true)})
对于多列唯一性
@Entity(indices = {@Index(value = {"first_name", "last_name"},unique = true)})
无法评论,所以我就在这里添加吧。如果手动迁移您的 Room DB 以使用 SQL 语句添加索引,您的索引名称必须符合 table 上的注释格式:
...
database.execSQL("CREATE UNIQUE INDEX index_tableName_columnName ON tableName (columnName)")
...
不确定索引名称可以有多长,所以不确定 multi-column 索引的样子。
我房间里只有一个实体
@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;
}
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
);
但是如果我想将以下约束附加到 table
的自动生成的 sql 架构中,我需要在实体 class 中添加哪些更改或注释unique (labelId, taskId)
最终我想使用房间库使 labelId 和 taskId 的组合在 table(或房间实体)中是唯一的。
不支持对列的普通 UNIQUE 约束,而不是通过索引。
您可以通过将 @Index 注释的唯一性 属性 设置为 true 来强制执行此唯一性 属性。以下代码示例 (Java) 防止 table 有两行包含 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;
}
注释的 Kotlin 等价物如下:
@Entity(indices = [Index(value = ["first_name", "last_name"], unique = true)])
在您的代码中,您可以进行以下更改以获得唯一约束
@Entity(foreignKeys ={
@ForeignKey(entity = Label.class, parentColumns = "_id", childColumns = "labelId", onDelete = CASCADE),
@ForeignKey(entity = Task.class, parentColumns = "_id", childColumns = "taskId", onDelete = CASCADE)},
indices = {@Index(value = {"labelId", "taskId"},
unique = true)}
)
public class LabelOfTask extends Data{
@ColumnInfo(name = "labelId")
private Integer labelId;
@ColumnInfo(name = "taskId")
private Integer taskId;
}
如果想使单个列唯一,只需要写
@Entity(indices = [Index(value = ["name"], unique = true)])
对于单列唯一性
@Entity(indices = {@Index(value = {"first_name"},unique = true)})
对于多列唯一性
@Entity(indices = {@Index(value = {"first_name", "last_name"},unique = true)})
无法评论,所以我就在这里添加吧。如果手动迁移您的 Room DB 以使用 SQL 语句添加索引,您的索引名称必须符合 table 上的注释格式:
...
database.execSQL("CREATE UNIQUE INDEX index_tableName_columnName ON tableName (columnName)")
...
不确定索引名称可以有多长,所以不确定 multi-column 索引的样子。