如何使用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注释列,但它没有效果。

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

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

在此处输入图像描述

我的假设是,由于您使用的是Kotlin,默认情况下将var视为非可选,因此您声明的所有属性都不是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 

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

请勿使用@ io.reactivex.annotations.NonNull进行配置

使用Kotlin的人的补充答案:

请注意,将types标记为非可选将自动使其不为null(并且可选types不会这样做)。

您可以在数据库中使用@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`) )" 

(注意:Datetypes在这里是Int ,UUID是一个字符串,因为我在别处使用的转换器)

对于Java,我在@NonNull之后使用@ColumnInfo

 @ColumnInfo(name = "column_name") @NonNull private String str; 

确保您已在类中导入了正确的库:

 import android.support.annotation.NonNull; 

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

例如,对于非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; 

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

您可以为其他types以及您希望拥有的任何默认值执行此操作。