Realm createOrUpdateAllFromJson для создания объектов RealmModel без сохранения?

Я вполне счастливо использую область Java в своем приложении для Android, находящемся в разработке. Я получаю JSONObject массивы от серверного API, и область покорно принимает их через удобный createOrUpdateAllFromJson объект экземпляра основной области.

Типичный поток для этого выглядит следующим образом:

// get API results into JSONArray jsonObjArrs variable
realm.beginTransaction();
realm.createOrUpdateAllFromJson(MyCoolModel.class,jsonObjArrs);
realm.commitTransaction();

Однако теперь я столкнулся с ситуацией, когда я хотел бы создать временный массив в памяти из тех же MyCoolModel объектов без фактического сохранения их в Realm, потому что я хочу выбросить их как как только будет выполнен конкретный вариант использования. Мне кажется, что createOrUpdateAllFromJson и его родственные методы доступны только для основного объекта экземпляра области.

Есть ли способ использовать этот удобный JSON для создания объектной модели, или мне нужно написать альтернативную реализацию с ручным/автоматическим разбором JSON?


person Dhiraj Gupta    schedule 30.11.2016    source источник


Ответы (3)


Если вам нужны объекты в памяти из структуры JSON, вам следует взглянуть на стандартный анализатор JSON, такой как GSON, Jackson или Moshi. Realm не имеет встроенного способа сделать это.

person Christian Melchior    schedule 01.12.2016
comment
Есть какие-нибудь мысли о моем решении использовать функцию In Memory Realm? Как это можно сравнить с использованием вместо этого ArrayList? - person Dhiraj Gupta; 02.12.2016

Смешно хакерское решение было бы

realm.beginTransaction();
realm.createOrUpdateAllFromJson(MyCoolModel.class,jsonObjArrs);
List<MyCoolModel> list = realm.copyFromRealm(realm.where(MyCoolModel.class)).findAll());
realm.cancelTransaction();
return list;

Но вам лучше использовать LoganSquare (или GSON/Moshi/и т. д.)

person EpicPandaForce    schedule 01.12.2016

В итоге я использовал функцию Realm «In memory Realm». Я написал простую функцию, которая возвращает новый экземпляр области в памяти с новым UUID в качестве имени:

public Realm unpersistedRealm(){
    RealmConfiguration myConfig = new RealmConfiguration.Builder()
            .name(UUID.randomUUID().toString())
            .inMemory()
            .build();
    return Realm.getInstance(myConfig);
}

Я использую это как отдельно созданный экземпляр только для одноразовых данных. Я создаю объекты, используя обычный вызов inMemoryRealmInstance.createOrUpdateAllFromJson(), и закрываю экземпляр в памяти, как только закончу. Я создаю экземпляр во время вызова моего фрагмента onCreateView() и закрываю область в onDestroyView().

Продолжение использования области (хотя и экземпляра в памяти) дает мне следующие явные преимущества:

  • Встроенная дедупликация с использованием @PrimaryKey в моем ключевом поле MyCoolModel. Если бы я использовал ручной подход ArrayList<MyCoolModel>, о котором я думал ранее, мне пришлось бы вручную дедуплицировать и беспокоиться о других головных болях, которые Realm уже решил за меня.
  • Сортировка, фильтрация и т. д. на основе запросов.
person Dhiraj Gupta    schedule 02.12.2016