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
在这里所做的,为您提供了编译时安全性。可能会使现场包受保护或私有,并有一个房间可以使用的构造函数?这样就没有直接的字段设置器。