首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >必须用@NonNull (复合主键)注释主键

必须用@NonNull (复合主键)注释主键
EN

Stack Overflow用户
提问于 2020-04-26 16:59:14
回答 1查看 1.2K关注 0票数 2

我的Android项目中有以下Java类。

代码语言:javascript
复制
@Entity
public class Daily {

    @PrimaryKey
    private Date dailyId;

    //Other non important attrs, getters, setters, etc.

}

@Entity(primaryKeys = {"dailyId", "dailyDetailId"})
public class DailyDetail {

    private Date dailyId; //which is the value of its unique parent.
    private Long dailyDetailId;

    //Other non important attrs, getters, setters, etc.

}

顺便说一句:我已经添加了类型转换器。

当我试图构建这个项目时,我会得到以下错误:

代码语言:javascript
复制
You must annotate primary keys with @NonNull. "dailyId" is nullable. SQLite considers this a bug and Room does not allow it.

然后,当我按照说明将@NonNull添加到dailyid中时,它是Not-null fields must be initialized (?)

我该怎么解决这个问题?我的想法是初始化两个主键,但是当我尝试向DB插入一个新对象时,这应该是一个问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-26 17:30:01

然后,当我按照指令将@NonNull添加到dailyid时,它说非空字段必须初始化(?)

如果用@NonNull对字段进行注释,就会告诉编译器“这个东西永远不会是空的”。但是,Java中未初始化对象的默认值是什么?没错!零。因此,如果用@NonNull对字段进行注释,则必须对其进行初始化,以确保它不会从null开始。

我该怎么解决这个问题?

初始化您的字段。无论是在声明时还是在类构造函数中。

代码语言:javascript
复制
@NonNull
@PrimaryKey
private Date dailyId = new Date(); // Now it's initialized and not null

代码语言:javascript
复制
@Entity
public class Daily {

    @NonNull
    @PrimaryKey
    private Date dailyId;

    public Daily() {
        dailyId = new Date(); // Now it's initialized and not null
    }

    // ^- this AND / OR this -v

    // Note here that if using an argument in the constructor, it too must be
    // annotated as @NonNull to tell the compiler that you're setting the value
    // of your non-nullable field to something that won't itself be null
    public Daily(@NonNull Date initialDate) {
        dailyId = initialDate; // Now it's initialized and not null
    }
}

希望这能帮上忙!

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61444648

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档