Я следующие классы:Android Realm copyToRealmOrUpdate создает дубликаты вложенных объектов
public class Note extends RealmObject {
@PrimaryKey
private String id;
private Template template;
// other primitive fields, getters & setters
}
public class Template extends RealmObject {
private String name;
private String color;
// other primitive fields, getters & setters
}
Я получаю мои данные из внутреннего интерфейса через Retrofit & Gson, поэтому у меня есть готовые к использованию объекты Java в ответ.
Давайте представим, что бэкэнд возвращает мне то же три Notes каждый раз, когда я его вызываю. Когда я получаю список Примечание объектов, я делаю следующее:
private void fetchNotesAndSave() {
List<Notes> notes = getNotesViaRetrofit();
Realm realm = Realm.getInstance(mContext);
realm.beginTransaction();
realm.copyToRealmOrUpdate(notes);
realm.commitTransaction();
realm.close();
}
После того, что я называю эти строки, чтобы проверить количество хранимых объектов:
int notesCount = mRealm.where(Note.class).findAll().size();
int templatesCount = mRealm.where(Template.class).findAll().size();
Впервые:
notesCount == 3;
templatesCount == 3;
Правильно. Но, если я снова вызвать сервер, получить те же ноты (те же PrimaryKey идентификаторы), и вызвать fetchNotesAndSave() еще раз, я получаю эти результаты:
notesCount == 3;
templatesCount == 6;
Каждый раз, когда я называю copyToRealmOrUpdate(), вложенные объекты, которые находятся внутри объектов с primaryKey, дублируются - не обновляются.
Есть ли способ изменить это поведение? Пожалуйста, дайте мне знать, если вам нужна дополнительная информация. Заранее спасибо!
Я понимаю это, но в моем случае существует много вложенных классов, и я не могу создать '@ PrimaryKey' для каждого из них. И, например, я использую этот трюк для обработки списка строк https://github.com/realm/realm-java/issues/575, поэтому я должен генерировать '@ PrimaryKey' для каждого из' RealmString'. Это будет настоящий ад ... –
Есть ли какое-либо обходное решение, чтобы поддерживать вложенные отношения друг с другом в один класс с суперклассом без '@ PrimaryKey', поэтому они обновлены правильно? –
В настоящее время нет. Вам придется выполнять эту очистку вручную. –