Хранение отношений в Realm (Java)

Я начинаю использовать Realm для хранения объектов в своем приложении для Android. Вот пример того, что я хочу сохранить:

public class Item implements RealmModel {
    String id;
    ...
}

У меня есть несколько списков, в которых отображаются элементы. Количество списков может увеличиваться (пользователь может создать как можно больше списков.

Допустим, пользователь создает список под названием «Лучшие». Когда я просматриваю список «Лучшие», я вызываю getItems("Best"), который получает List<Items> от API. Теперь мне нужно выяснить, как сохранить этот список. В мире SQLite я бы, например, создал новую таблицу custom_list_best, которая представляет собой единственный список всех Item.id, входящих в этот список. У меня также была бы таблица «items», в которой есть все отдельные Items. Чтобы получить элементы в списке лучших, я бы просто выполнил запрос соединения как для таблицы best, так и для таблицы элементов.

В мире Realm я пытаюсь понять, как работает Realm и как лучше всего строить свои модели.

Сначала я думал, что могу создать объект с именем CustomList:

public class CustomList implements RealmModel {
    String listId;
    RealmList<Item> items;
}

Тогда я бы сохранил RealmList<CustomList>. Но единственная проблема в том, что я также хочу иметь возможность запрашивать все элементы. Так что мне также нужно сохранить RealmList<Item> в Realm. Как в этом случае работает Realm? Если я сохраню отдельный RealmList<Item>, а затем сохраню каждый RealmList<CustomList>, не будут ли дублироваться данные?

Вместо этого мне придется вручную обрабатывать это, сделав вместо этого следующее:

public class CustomList implements RealmModel {
    String listId;
    List<String> itemIds;
}

А затем запросить Item.class объекты, у которых есть itemId в itemIds из вышеуказанного объекта?


person LyteSpeed    schedule 12.12.2016    source источник


Ответы (1)


В мире SQLite я бы создал новую таблицу custom_list_best,

Нет, у вас будет таблица с именем custom_lists с идентификатором автоинкремента и идентификатором, а также таблица соединений с именем join_custom_lists_items, которая будет содержать идентификатор custom_lists и идентификатор любого item, принадлежащего этому заданному настраиваемому списку.

В мире Realm я пытаюсь понять, как работает Realm и как лучше всего строить свои модели.

Если ID элемента является конкретным и вам нужно иметь возможность хранить один и тот же Item в нескольких списках, то для доступа к спискам в обоих направлениях вам понадобится RealmList<? extends RealmModel> в обоих случаях.

@RealmClass
public class Item implements RealmModel {
    @PrimaryKey
    private String id;

    private RealmList<CustomList> customLists;

    // getter setter
}

А также

@RealmClass
public class CustomList implements RealmModel {
    @PrimaryKey
    private String title; // assuming you cannot name two lists the same? otherwise do `@Index`

    private RealmList<Item> items;

    // getter setter
}

Таким образом вы можете сделать

realm.executeTransaction(new Realm.Transaction() {
  public void execute(Realm realm) {
    Item item = realm.where(Item.class).equalTo(ItemFields.ID, itemId).findFirst(); // assuming exists
    CustomList customList = realm.where(CustomList.class).equalTo(CustomListFields.TITLE, "Best").findFirst();
    if(customList == null) {
         customList = realm.createObject(CustomList.class, "Best");
    }
    customList.getItems().add(item);
    item.getCustomLists().add(customList);
  }
}

И тогда вы можете запросить

RealmResults<Item> bestItems = realm.where(Item.class)
                                    .equalTo(ItemFields.CustomLists.TITLE, "Best")
                                            //same as "customLists.title"
                                    .findAll();

Все эти Fields материалы, которые я использую, взяты из https://github.com/cmelchior/realmfieldnameshelper

person EpicPandaForce    schedule 12.12.2016