如何使用 Android Room Persistence Library 将 Column 注释为 NOT NULL [英] How to annotate Column as NOT NULL using Android Room Persistence Library

查看:32
本文介绍了如何使用 Android Room Persistence Library 将 Column 注释为 NOT NULL的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的数据类看起来像这样

@Entity(tableName = "items")数据类项目(@ColumnInfo(name = "name") var name: String = "",@ColumnInfo(name = "room") var room: String = "",@ColumnInfo(name = "quantity") var 数量: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 的准确注释,我浏览了以下链接中提供的所有注释的列表:

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

var name: String//NOT NULL变量名称:字符串?//可选的

根据评论更新:

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

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

基本上,转换以下语句:

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

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

My data class looks like this

@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 uses SQLite and SQLite supports NOT NULL columns in its database. I tried annotating columns with @NonNull but it has no effect.

Is there a way to make columns in Room Database not nullable?

解决方案

In order to identify exact annotation for NOT NULL I went through the list of all annotations provided at this link: android.arch.persistence.room but could not find any relevant annotation:

My assumption is that since you are using Kotlin, which by default treats a var as non-optional, all the attributes declared by you are NOT NULL. In order to declare a var as optional probably you have to use a ? operator, an example below:

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

Updated based on comment:

I guess you are confused with NULL and empty string. NULL means no value, in the shared code you are providing a default value to each column which is an empty string and that is not equal to NULL, so even though you might not have provided a value for that attribute it is by default assigning an empty string to it.

Try removing value assignment operator and RHS value for an attribute and then insert the record without assigning value to that attribute, you should get appropriate error.

Basically, convert below statement:

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

To

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

这篇关于如何使用 Android Room Persistence Library 将 Column 注释为 NOT NULL的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆