Realm: избавиться от дублирования элементов в RealmList

Апдейт данных через createOrUpdateAllFromJson — удобная штука, однако без танцев с бубном не обошлось — данные из свойства объекта типа RealmList дублируются только в путь. Как это решить?

Итак, возьмем абстрактную задачу — есть курс обучения, в котором есть список студентов. Время от времени приложение запрашивает обновление с сервера, при этом локальные данные не хотелось бы терять. Метод Realm.createOrUpdateAllFromJson помогает в этом как нельзя лучше — пусть и немного кривоватое решение, но оно работает

If updating a {@link RealmObject} and a field is not found in the JSON object, that field will not be updated.

Сохраняются все Realm модели у меня с помощью метода save(). Обычно в нем содержится что-то типа

Но конкретно в данном случае этот метод не прокатит. Поэтому пришлось написать следующую конструкцию (по шагам),

  • Берем модель с обновленными данными (как они заполняются — не важно)
  • Создаем массив с одним элементом — конкретно сохраняемым экземпляром класса
  • Создаем json строку из массива
  • Сохраняем ее с помощью createOrUpdateAllFromJson

(в этот момент можно открыть Realm Browser и убедиться, что после нескольких сейвов данные в RealmList дублируются только в путь). Поэтому

  • Берем наше поле, удаляем в нем дубликаты и пересохраняем объект.
  • Добавляем красоты, универсальности и вот этого всего.

Процедура сохранения объекта выглядит просто замечательно:

Ну и конечно же опишем интерфейс, который нам помогает все сделать чисто и симпатично:

P.S. Если вы попытались, но у вас не работает, подумайте — а что именно экземпляр делает уникальным?

Переопределите метод equals в вашем классе. Желательно, конечно, по primary key.

One clap, two clap, three clap, forty?

By clapping more or less, you can signal to us which stories really stand out.