Вы должны аннотировать первичные ключи с помощью @NonNull (составной первичный ключ) - PullRequest
0 голосов
/ 26 апреля 2020

В моем проекте Android есть следующие классы Java.

@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.

}

Кстати: я уже добавил преобразователи типов.

И я получаю следующую ошибку при попытке построить проект:

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 (?)

Как мне это исправить? Моя идея состоит в том, чтобы инициализировать оба первичных ключа, но это должно быть проблемой, когда я пытаюсь вставить новый объект в БД.

1 Ответ

1 голос
/ 26 апреля 2020

Затем, когда я следую инструкциям и добавляю @NonNull к dailyid, он говорит, что поля с ненулевым значением должны быть инициализированы (?)

Если вы аннотируете поле с помощью @NonNull вы говорите компилятору "эта вещь никогда не будет нулевой". Но каково значение по умолчанию для неинициализированного объекта в Java? Вот так! Нулевой . Поэтому, если вы аннотируете поле с помощью @NonNull , вы должны инициализировать его , чтобы гарантировать, что оно не начинается с нуля.

Как это исправить?

Инициализируйте свое поле. Либо сразу в объявлении, либо в конструкторе класса.

@NonNull
@PrimaryKey
private Date dailyId = new Date(); // Now it's initialized and not null

ИЛИ

@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
    }
}

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...