Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Android Room持久性库将列注释为非空_Android_Sqlite_Kotlin_Android Room - Fatal编程技术网

如何使用Android Room持久性库将列注释为非空

如何使用Android Room持久性库将列注释为非空,android,sqlite,kotlin,android-room,Android,Sqlite,Kotlin,Android Room,我的数据类看起来像这样 @Entity(tableName = "items") data class Item( @ColumnInfo(name = "name") var name: String = "", @ColumnInfo(name = "room") var room: String = "", @ColumnInfo(name = "quantity") var quantity: String = "", @C

我的数据类看起来像这样

@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在其数据库中支持NOTNULL列。我尝试用@NonNull注释列,但没有效果


有没有办法使文件室数据库中的列不可为空?

为了确定非空的确切注释,我浏览了此链接提供的所有注释列表:但找不到任何相关注释:

我的假设是,由于您使用的是Kotlin,默认情况下它将var视为非可选的,因此您声明的所有属性都不是NULL。为了将var声明为可选变量,您可能必须使用?操作员,下面是一个示例:

var name: String // NOT NULL 
var name: String? // OPTIONAL
根据评论更新:

我猜你被空字符串和空字符串弄糊涂了。NULL表示无值,在共享代码中,您为每一列提供了一个默认值,该值为空字符串且不等于NULL,因此,即使您可能没有为该属性提供值,默认情况下也会为其分配一个空字符串

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

基本上,转换以下语句:

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


作为实际表约束的变通方法,您可以使用单个方法TypeConverter类来确保字符串成员不为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混为一谈

对于那些使用Kotlin的人,补充回答:

请注意,将类型标记为非可选将自动使其不为null(可选类型不会这样做)

您可以使用数据库上的
@Database(exportSchema=true)
在room生成的架构中检查它

例如,我有这样的东西:

@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`)
)"

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

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

@ColumnInfo(name = "column_name")
@NonNull private String str;
确保已在类中导入正确的库:

import android.support.annotation.NonNull;

默认情况下,它的t不为空?因为我也在处理room persistence lib,并意外地将null发送到数据库,它引发了异常。我得到了一些空字段,比如空字符串,它工作正常,所以我猜不是这样的。那么你的问题是什么?我对数据库中的not null的理解意味着它不能是空字段,它需要分配一个值,以便空字符串“”将被视为NULL。在kotlin中,String意味着它所分配的对象不是null,在我的例子中默认为空字符串。我只希望我的数据库在被分配为空字符串时抛出异常。我想你不能在RoomI中这样做,我会将它标记为正确的,因为它澄清了我对空字符串和null的混淆。然而,在我的特殊情况下,您建议的转换语句(第二个)是不可编译的,因为Room需要默认构造函数,要做到这一点,每个参数都必须具有默认值。但是谢谢你的帮助!谢谢,一开始,这个答案对我不起作用,因为我把变量的作用域设置为
private
。谢谢。使用
NonNull
annotation+设置属性而不赋值也解决了我的问题@Devarshi“它需要有一个赋值,这样空字符串“”将被视为NULL”,这是不正确的。空字符串不为null。空就是空。空字符串是长度为0的字符串对象。您刚刚保存了我的一天!如果我们需要在Room中使用RxJava,那么在创建实体时应该导入哪个呢?Ishwor Khanal,same@android.support.annotation.NonNull,rx的注释主要用于内部目的,注意基本类型(int、long等)总是被认为是非空的,您不必这样注释它们。@BeerMe,你知道记录在哪里吗?我刚刚发现在中提到了原语类型的管理。似乎浮点类型的处理方式不同,默认情况下可以为null。@shield,我手头没有实际的文档,但这个答案很好地概括了这一点:另外,我在你的链接文章中没有看到任何对浮点类型的引用,但它说“房间中的所有基本类型默认为非null”。@BeerMe,谢谢。我关于浮动类型的错误。在我看到的示例中,列类型不是基元。它被声明为Float,而不是Float,因此在默认情况下可以为null。
import android.support.annotation.NonNull;