如何使用 Android Room Persistence Library 将 Column 注释为 NOT NULL

新手上路,请多包涵

我的数据类看起来像这样

@Entity(tableName = "items")
data class Item(
        @ColumnInfo(name = "name") var name: String = "",
        @ColumnInfo(name = "room") var room: String = "",
        @ColumnInfo(name = "quantity") var quantity: String = "",
        @ColumnInfo(name = "description") var description: String = "",
        @PrimaryKey(autoGenerate = true)
        @ColumnInfo(name = "id") var id: Long = 0
)

Room 使用 SQLite,SQLite 在其数据库中支持 NOT NULL 列。我尝试用 @NonNull 注释列,但它没有效果。

有没有办法让房间数据库中的列不可为空?

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

阅读 523
2 个回答

为了确定 NOT NULL 的确切注释,我浏览了此链接提供的所有注释列表: android.arch.persistence.room 但找不到任何相关注释:

在此处输入图像描述

我的假设是,由于您使用的是默认情况下将 var 视为非可选的 Kotlin,因此您声明的所有属性都不是 NULL。为了将 var 声明为可选的,您可能必须使用 ?运算符,示例如下:

 var name: String // NOT NULL
var name: String? // OPTIONAL

根据评论更新:

我猜你对 NULL 和空字符串感到困惑。 NULL 表示没有值,在共享代码中,您为每个列提供了一个默认值,该值是一个空字符串并且不等于 NULL,因此即使您可能没有为该属性提供一个值,它也会默认分配一个空字符串。

尝试删除属性的赋值运算符和 RHS 值,然后插入记录而不为该属性赋值,您应该会收到相应的错误。

基本上,转换以下语句:

 @ColumnInfo(name = "name") var name: String = ""

@ColumnInfo(name = "name") var name: String

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

对于 Java,您应该使用 @android.support.annotation.NonNull 进行注释

不要混淆 @io.reactivex.annotations.NonNull

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

推荐问题