在使用Room持久性库时,我发现没有一种方法可以对数据类字段设置NOT NULL和UNIQUE约束。SQLite是否支持这些约束呢?在迁移旧数据库中使用这些约束时会有问题吗?有人能否针对此问题提出建议吗?
在使用Room持久性库时,我发现没有一种方法可以对数据类字段设置NOT NULL和UNIQUE约束。SQLite是否支持这些约束呢?在迁移旧数据库中使用这些约束时会有问题吗?有人能否针对此问题提出建议吗?
@NonNull
注解?
是android.support.annotation
还是javax.annotation
? - Iftaandroid.support.annotation
,但希望Room注解处理器可以检查两者。 - CommonsWare@Entity(tableName = "some_table", indices = [ Index(value = ["some_field"], unique = true) ])
的翻译如下:实体注解 @Entity
的参数包括表名 tableName
和索引 indices
,其中索引通过数组的形式传入。在索引数组中,可以使用 Index
注解来指定需要建立索引的字段及其属性,如是否唯一等。在这个例子中,我们指定了一个名为 "some_field"
的字段需要创建唯一索引。 - Vlad关于在使用Kotlin时的NOT NULL
的补充说明:
请注意,将类型标记为非可选类型将自动使其非空(而可选类型则不会这样做)。
您可以通过在数据库上使用@Database(exportSchema = true)
来检查Room生成的模式。
例如,我有这样的代码:
@Entity(tableName = "messages")
data class Message (
@PrimaryKey
val messageId: UUID = UUID.randomUUID(),
val date: Date = Date(),
val receivedDate: Date? = null
)
在生成的架构中,我可以读到:
"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`messageId` TEXT NOT NULL, `date` INTEGER NOT NULL, `receivedDate` INTEGER, PRIMARY KEY(`messageId`))"
(注:此处的Date类型是一个Int
,UUID是字符串,因为我在其他地方使用的转换器)
对于可空字段,您可以使用包装器原始类型Java。例如,在您的Room表中使用Integer实例int。 就像在包装器原始类型java中一样,这可以是null,但原始类型类不能为null。并且在生成使用notNull = true的原始字段的SQL代码时,但是当使用Integer生成SQL代码时,使用notNull = false。
@Entity(primaryKeys = {"rollNumber", "class"})
class Student {
@NonNull
private int rollNumber;
private String firstName;
private String lastName;
private int class;
}