在使用 Room Persistence Library 时,我了解到没有方法可以设置具有 NOT NULL 和 UNIQUE 约束的数据类字段。 SQLite 是否支持这些约束。迁移使用这些约束的旧数据库不是问题吗?谁能就这个问题提出建议?
原文由 raggedycoder 发布,翻译遵循 CC BY-SA 4.0 许可协议
在使用 Room Persistence Library 时,我了解到没有方法可以设置具有 NOT NULL 和 UNIQUE 约束的数据类字段。 SQLite 是否支持这些约束。迁移使用这些约束的旧数据库不是问题吗?谁能就这个问题提出建议?
原文由 raggedycoder 发布,翻译遵循 CC BY-SA 4.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 许可协议
3 回答824 阅读✓ 已解决
2 回答2.1k 阅读
2 回答948 阅读✓ 已解决
2 回答680 阅读✓ 已解决
1 回答1.1k 阅读✓ 已解决
1 回答723 阅读✓ 已解决
2 回答843 阅读
@NonNull
@Entity
字段上的注释将导致该字段的列应用NOT NULL
。unique=true
在@Index
将强制执行唯一性约束(例如@Entity(indices={@Index(value="something", unique=true)}
)。但是,您是正确的,除了通过索引之外,不支持列上的普通UNIQUE
约束。Room 不支持现有的数据库结构,特别是在当前
alpha
状态下。随着时间的推移,我希望 Room 支持更高百分比的 SQLite 功能,但如果它达到 100%,我会感到震惊。