java – 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对象作为回应.

让我们想象一下,每次我称之为后端,我都会收到相同的三个笔记.
当我获得Note对象的列表时,我执行以下操作:

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 ids),然后再次调用fetchNotesAndSave(),我将得到以下结果:

notesCount == 3;
templatesCount == 6;

每次调用copyToRealmOrUpdate()时,与primaryKey对象内部的嵌套对象都将重复 – 不会更新.

有没有办法改变这种行为?
如果您需要更多信息,请通知我.提前致谢!

解决方法

这是因为您的Template类没有任何主键.在这种情况下,这些对象将被重新插入,因为不能保证引用的模板对象安全地被更新,即使它们是具有主键的另一个对象的一部分.

如果你添加一个@PrimaryKey到你的模板类,它应该按照你期望的方式工作.

相关文章

Android 如何解决dialog弹出时无法捕捉Activity的back事件 在...
Android实现自定义带文字和图片的Button 在Android开发中经常...
Android 关于长按back键退出应用程序的实现最近在做一个Andr...
android自带的时间选择器只能精确到分,但是对于某些应用要求...