Tengo una entidad en la habitación

@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;
}

La sintaxis sql de esta entidad es la siguiente

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
 );

Pero qué cambio o anotación necesito agregar en la clase de entidad si quiero agregar la siguiente restricción al esquema SQL generado automáticamente de la tabla

unique (labelId, taskId)

En última instancia, quiero hacer que la combinación de labelId y taskId sea única en una tabla (o entidad de sala) usando la biblioteca de sala.

25
Kevan 24 feb. 2018 a las 14:03

2 respuestas

La mejor respuesta

No se admite una restricción ÚNICA simple en una columna, que no sea a través de un índice.

Puede aplicar esta propiedad de unicidad estableciendo la propiedad única de una anotación @Index en verdadero. El siguiente ejemplo de código (Java) evita que una tabla tenga dos filas que contengan el mismo conjunto de valores para las columnas firstName y 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;
}

El equivalente de Kotlin de la anotación se da a continuación:

@Entity(indices = arrayOf(Index(value = ["first_name", "last_name"], unique = true)))

En su código, puede hacer los siguientes cambios para tener restricciones ÚNICAS

@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;
}
44
Amit Dash 3 abr. 2019 a las 07:47

Si se pregunta cómo hacer que una sola columna sea única, solo necesita escribir

@Entity(indices = [Index(value = ["name"], unique = true)])
14
parohy 20 feb. 2020 a las 10:18