如何使用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 ) 

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

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

为了识别NOT NULL的确切注解,我通过了这个链接提供的所有注释列表: android.arch.persistence.room,但是找不到任何相关的注释:

在这里输入图像描述

我的假设是,因为你正在使用Kotlin,默认将var作为非可选项,所以你声明的所有属性都不是NULL。 为了声明一个变量可选可能你必须使用? 下面是一个例子:

 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 

作为解决实际表约束的方法,您可以使用单个方法TypeConverter类来确保您的String成员不为null。

例如,对于非空字符串,可以使用:

 public class RoomConverterNullString { @TypeConverter public static String fromNullToString(String value) { if (value == null) { return ""; } else { return value; } } } 

当然,你可以这样简化它:

 public class RoomConverterNullString { @TypeConverter public static String fromNullToString(String value) { return (value == null) ? "" : value; } } 

你可以像这样使用它:

 @TypeConverters(RoomConverterNullString.class) public String stringMember; 

当值为空时,任何赋值和更新/插入操作都将存储一个空字符串值,任何检索操作都会强制将空值转换为空字符串。

您可以为其他类型和任何默认值执行此操作。

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

不要使用@ io.reactivex.annotations.NonNull