Android studio 声明一个房间变量';在内存中是@null,但在SQLite数据库中是@NonNull?

Android studio 声明一个房间变量';在内存中是@null,但在SQLite数据库中是@NonNull?,android-studio,android-room,Android Studio,Android Room,下面是一个典型的例子: @Entity class Kozmique { @PrimaryKey(autoGenerate = true) @NonNull // TODO how to be non-null in the database but nullable in memory? public Long id; 在内存中,除了一个oracle之外,任何人都不应该分配kozmique.id,KozmiqueDao.insert的返回值。因此,要创建一个Ko

下面是一个典型的例子:

@Entity
class Kozmique {

    @PrimaryKey(autoGenerate = true)
    @NonNull  // TODO  how to be non-null in the database but nullable in memory?
    public Long id;
在内存中,除了一个oracle之外,任何人都不应该分配
kozmique.id
KozmiqueDao.insert
的返回值。因此,要创建一个
Kozmique
并将其输入数据库,必须使用空
id
临时运行

但是在数据库中,ID应该是
notnull
,因为空值一旦进入,我们就需要一条错误消息

那么,我如何准确地告诉Room我需要什么,而不是允许Room利用SQL和Java的混合,这两者都不精确


退路是这样的:

@PrimaryKey(autoGenerate = true)
@NonNull
long id = 0;
现在SQLite数据库正确地包含
notnull

…但Android Studio有一个小漏洞,警告我“不要在基本类型上加@NonNull”

在这种模式下,我需要一个原语类型,在Java中,因为如果有任何赋值或比较
null
,我需要一个语法错误


如果Room没有借用
@NotNull
,这意味着其他东西,比如SQL中的
NotNull
的标志,那么所有这些乐趣都可以避免
@ColumnInfo
应该支持一个
非空
标志。

假设您已经用autoGenerate注释了PK,并且Room希望值
0
表示“未分配密钥”,我相信Room还需要公共getter和setter(必须按照Room的预期设置并返回0),我认为您无法更改db模型上的id字段。这似乎表明你只有一个选择;若要使用将id公开为
Long?
的业务层模型包装db模型,请将0重新映射为null。是否尝试使用原语类型:
public Long id=0?当值为
0时
Room仍将自动生成id。我的示例只是一个示例。我认为Room应该支持一个没有@nonnull确切语义的“notnull”指令,这不是很危险吗?您需要保护您自己和其他开发人员,避免意外地将空值插入到NOTNULL列中,这正是
@NonNull
在这里所做的,为您提供了编译时安全性。可能会使现场包受保护或私有,并有一个房间可以使用的构造函数?这样就没有直接的字段设置器。