Realm для Android: отношения «многие ко многим»

Я пытаюсь изучить основы Realm, реализуя простой проект Android. Идея состоит в том, что у пользователя есть несколько элементов и несколько списков элементов, и элемент может быть добавлен в любой из этих списков, а в списке может быть много элементов. Таким образом, между объектами Item и List существует связь "многие ко многим". Вот мои объекты.

public class Item extends RealmObject {

    @PrimaryKey
    private String id;
    private String name;
    private boolean isDone;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public boolean isDone() {
        return isDone;
    }

    public void setDone(boolean done) {
        isCollected = done;
    }
}

public class List extends RealmObject {

    @PrimaryKey
    private String id;
    private String name;
    private RealmList<Item> items;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public RealmList<Item> getItems() {
        return items;
    }

    public void setItems(RealmList<Item> items) {
        this.items = items;
    }
}

Моя проблема в том, что поле isDone может отличаться в зависимости от статуса элемента в данном списке. Но когда я обновляю это поле в списке, все остальные элементы, добавленные в разные списки, также обновляются. Поскольку они используют один и тот же объект, это имеет смысл, но это не то поведение, которое я хочу. Есть ли способ Realm создать сводную таблицу/объект с дополнительным столбцом/полем (в этом случае isDone)?

Любая помощь будет оценена по достоинству.


person Tartar    schedule 15.07.2018    source источник
comment
But when I update this field in a list, all the other items added to different lists get updated too. что ты имеешь в виду? показать код   -  person EpicPandaForce    schedule 15.07.2018
comment
Допустим, есть один объект Item, и я использую его в разных списках. Когда я изменяю поле isDone этого объекта, оно меняется и в других списках.   -  person Tartar    schedule 16.07.2018


Ответы (1)


Проблема в том, что свойство isDone Item на самом деле не принадлежит Item. Если вы можете установить один и тот же элемент в нескольких списках, то свойство, заключающееся в том, что данная задача считается завершенной в данном списке, является свойством списка.

public class Item extends RealmObject {

    @PrimaryKey
    private String id;
    private String name;
    //private boolean isDone;

    @LinkingObjects("completedItems")
    private final RealmResults<List> tasksCompletedIn = null;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    //public boolean isDone() {
    //    return isDone;
    //}

    //public void setDone(boolean done) {
    //    isDone = done;
    //}
}

public class List extends RealmObject {

    @PrimaryKey
    private String id;
    private String name;
    private RealmList<Item> items;
    private RealmList<Item> completedItems;

Затем вы знаете, является ли это завершенным элементом, если completedItems.contains(item) (где item является управляемым объектом или переопределяет equals для проверки только id)

person EpicPandaForce    schedule 16.07.2018