我遇到Realm的问题,一对多的关系并更新现有条目以向关系中添加更多数据。
模型1
public class Model1 extends RealmObject
{
@PrimaryKey
private String identifier;
@SerializedName("type")
private String type;
@SerializedName("additionalInfo")
private String additionalInfo;
@SerializedName("options")
private RealmList<Model2> moreModels;
}
模型2
public class Model2 extends RealmObject
{
@SerializedName("hint")
private String hint;
@SerializedName("label")
private String label;
@SerializedName("favorite")
private boolean favorite;
@PrimaryKey
private String identifier;
}
因此,从API获取Model1对象列表,每个对象都包含自己的Model2对象列表。很简单。这很好用,我可以将它添加到Realm并查看关系。
现在,当我为另一个用户进行第二次API调用时,我的问题就出现了。我希望这项工作的方式是让Model2上的identifier属性由userId + label组成。因此,每个用户都有自己的Model2对象集。但是,我希望只有一组Model1对象,其中对Model2对象的引用会随着更多内容添加到Model2表而更新。
相反,我工作的是保留我的一组Model1(好),但与Model2的关系总是被最新的设置覆盖。所以我有一个Model2对象表,有80个条目,但只有最后40个被连接。
所以看起来我的更新或插入正在更新表中的Model1条目(GOOD),但不是将现有关系与新关系连接起来,而只是将关系更新为仅使用新关系。 Model2条目正在正确添加到其表中,因为没有基于主键的重复项。但是连接断了。
更新代码
List<Model1> test = response.body();
try(Realm realmInstance = Realm.getDefaultInstance()) {
realmInstance.executeTransaction((realm) ->
{
realm.insertOrUpdate(test);
final RealmResults<Model> category = realm.where(Model1).findAll();
}
);
}
答案 0 :(得分:1)
是的,这就是insertOrUpdate
和copyToRealmOrUpdate
方法目前的工作方式。理想情况下,您可以提供一种模式,例如REPLACE_LISTS
或MERGE_LISTS
,但现在尚未实施。
您唯一的选择是手动更新这些关系。