Tub*_*uby 18 sqlite android 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 = "",
        @ColumnInfo(name = "description") var description: String = "",
        @PrimaryKey(autoGenerate = true)
        @ColumnInfo(name = "id") var id: Long = 0
)
Run Code Online (Sandbox Code Playgroud)
Room使用SQLite和SQLite支持其数据库中的NOT NULL列.我尝试用@NonNull注释列,但它没有效果.
有没有办法让房间数据库中的列不可为空?
Nok*_*uap 38
对于Java,您应该使用@ android.support.annotation.NonNull进行注释
请勿使用@ io.reactivex.annotations.NonNull进行配置
Dev*_*shi 18
为了识别NOT NULL的确切注释,我浏览了此链接提供的所有注释列表:android.arch.persistence.room但找不到任何相关的注释:
我的假设是,由于您使用的是Kotlin,默认情况下将var视为非可选,因此您声明的所有属性都不是NULL.为了将var声明为可选,你可能需要使用?运算符,以下示例:
var name: String // NOT NULL 
var name: String? // OPTIONAL
Run Code Online (Sandbox Code Playgroud)
根据评论更新:
我猜你和NULL和空字符串混淆了.NULL表示没有值,在共享代码中,您为每个列提供了一个默认值,这是一个空字符串,并且不等于NULL,所以即使您可能没有为该属性提供值,它默认情况下分配一个值空字符串.
尝试删除属性的值赋值运算符和RHS值,然后插入记录而不为该属性赋值,您应该得到适当的错误.
基本上,转换如下声明:
@ColumnInfo(name = "name") var name: String = ""
Run Code Online (Sandbox Code Playgroud)
至
@ColumnInfo(name = "name") var name: String
Run Code Online (Sandbox Code Playgroud)
        对于我@NonNull之后使用的Java @ColumnInfo:
@ColumnInfo(name = "column_name")
@NonNull private String str;
Run Code Online (Sandbox Code Playgroud)
确保您已在类中导入了正确的库:
import android.support.annotation.NonNull;
Run Code Online (Sandbox Code Playgroud)
        使用Kotlin的人的补充答案:
请注意,将类型标记为非可选将自动使其不为null(并且可选类型不会这样做).
您可以在@Database(exportSchema = true)数据库中的房间生成的模式中进行检查.
例如,我有类似的东西:
@Entity(tableName = "messages")
data class Message (
        @PrimaryKey
        val messageId: UUID = UUID.randomUUID(),
        val date: Date = Date(),
        val receivedDate: Date? = null
)
Run Code Online (Sandbox Code Playgroud)
在生成的模式中,我可以阅读:
"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (
    `messageId` TEXT NOT NULL, 
    `date` INTEGER NOT NULL, 
    `receivedDate` INTEGER, 
    PRIMARY KEY(`messageId`)
)"
Run Code Online (Sandbox Code Playgroud)
(注意:Date类型在这里Int,UUID是一个字符串,因为我在其他地方使用的转换器)
作为实际表约束的变通方法,您可以使用单个方法 TypeConverter 类来确保您的 String 成员不为空。
例如,对于非空字符串,您可以使用:
public class RoomConverterNullString {
    @TypeConverter
    public static String fromNullToString(String value) {
        if (value == null) {
            return "";
        } else {
            return value;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)
当然,您可以像这样简化它:
public class RoomConverterNullString {
    @TypeConverter
    public static String fromNullToString(String value) {
        return (value == null) ? "" : value;
    }
}
Run Code Online (Sandbox Code Playgroud)
你可以像这样使用它:
@TypeConverters(RoomConverterNullString.class)
public String stringMember;
Run Code Online (Sandbox Code Playgroud)
当值为空时,任何赋值和更新/插入操作都将存储一个空字符串值,并且任何检索都将强制将空值转换为空字符串。
您可以为其他类型和您希望拥有的任何默认值执行此操作。
|   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           19088 次  |  
        
|   最近记录:  |