Room Persistence Library 没有“NOT NULL”和“UNIQUE”约束

新手上路,请多包涵

在使用 Room Persistence Library 时,我了解到没有方法可以设置具有 NOT NULL 和 UNIQUE 约束的数据类字段。 SQLite 是否支持这些约束。迁移使用这些约束的旧数据库不是问题吗?谁能就这个问题提出建议?

原文由 raggedycoder 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 610
2 个回答

我开始知道没有方法可以设置具有 NOT NULL 和 UNIQUE 约束的数据类字段

@NonNull @Entity 字段上的注释将导致该字段的列应用 NOT NULL

unique=true@Index 将强制执行唯一性约束(例如 @Entity(indices={@Index(value="something", unique=true)} )。但是,您是正确的,除了通过索引之外,不支持列上的普通 UNIQUE 约束。

迁移使用这些约束的旧数据库不是问题吗?

Room 不支持现有的数据库结构,特别是在当前 alpha 状态下。随着时间的推移,我希望 Room 支持更高百分比的 SQLite 功能,但如果它达到 100%,我会感到震惊。

原文由 CommonsWare 发布,翻译遵循 CC BY-SA 3.0 许可协议

关于 NOT NULL 对于那些使用 Kotlin 的人的补充回答:

请注意,将类型标记为非可选类型会自动使其不为空(而可选类型不会这样做)。

您可以在数据库中使用 @Database(exportSchema = true) 在房间生成的模式中检查它。

例如我有这样的东西:

 @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 是字符串,因为我在别处使用了转换器)

原文由 Vincent Hiribarren 发布,翻译遵循 CC BY-SA 3.0 许可协议

推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏