Царство: используйте одно или несколько царств в приложении (и одну или несколько схем)

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

  • Сохраните элементы, выбранные пользователем.
  • (приложение имеет чат). Сохраните чаты и последние константы.
  • Реализовать постоянный кеш для некоторых запросов приложения
  • Сохранить последние поисковые запросы/форму, чтобы обеспечить автозаполнение

(Позволяет называть каждую из этих точек модулем/пакетом)

Каждый модуль/пакет имеет несколько RealmObjects для сохранения. Как мне организовать это? С точки зрения чистоты кода, производительности или чего бы я ни заботился

Вариант A: используйте уникальную (по умолчанию) область с уникальной схемой:

Используйте Realm.getInstance(context)

Доступ к правильному RealmObjects в каждом модуле/пакете

Вариант B: используйте несколько областей со схемой по умолчанию

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

Поскольку данные принадлежат к разным частям приложения, изолированы и не связаны друг с другом, для каждого модуля используется другое имя области.

Опция C: использование нескольких областей и областей применения классов моделей, используемых со схемой для каждого пакета приложений Укажите имя и схему для каждого изолированного пакета. В примере:

public static Realm getChat(Context context){
    RealmConfiguration config = new RealmConfiguration.Builder(context)
            .name("chat.realm")
            .schemaVersion(1)
            .setModules(new ChatRealmModule())
            .build();
    return Realm.getInstance(config);
}

// Create the module
@RealmModule(classes = { ChatRoom.class, ChatMessage.class, ChatUser.class})
public static class ChatRealmModule{
}

Вариант D: Другой?

Ответ 1

Если ваши данные действительно полностью отключены, я бы пошел с опцией C) Это обеспечивает чистое разделение. Миграции легче обрабатываются, а также очень небольшое усиление производительности, так как Realm должен периодически перебирать все классы моделей в Realm.

Но ни один из вариантов не является "неправильным".

Ответ 2

Да, вы можете, хотя обычно вы можете иметь несколько классов в Realm

Конфигурирование других вершин показывает, как указать разные пути к файлу, например:

RealmConfiguration myConfig = new RealmConfiguration.Builder(context)
  .name("myrealm.realm")
  .schemaVersion(2)
  .modules(new MyCustomSchema())
  .build();

RealmConfiguration otherConfig = new RealmConfiguration.Builder(context)
  .name("otherrealm.realm")
  .schemaVersion(5)
  .modules(new MyOtherSchema())
  .build();

Realm myRealm = Realm.getInstance(myConfig);
Realm otherRealm = Realm.getInstance(otherConfig);

@RealmModule(classes={Abc.class, Pqrs.class, Xyz.class})
class MyCustomSchema{}

@RealmModule(classes={Abc1.class, Pqrs2.class, Xyz2.class})
class MyOtherSchema{}