我有一个名为Message(下面的代码段)的Realm对象,它也可以在其中包含相同类型的嵌套消息:
public class Message extends RealmObject {
@PrimaryKey
private int id;
@Getter
@Setter
private RealmList<Message> nestedMessages;
}
在某些时候,我需要更新嵌套消息列表,例如,如果添加了新的嵌套消息。
我这样做:
//newMessage is returned from a request
realm.beginTransaction();
RealmList<Message> nestedMessages = initialMessage.getNestedMessages();
nestedMessages.add(newMessage);
initialMessage.setNestedMessages(nestedMessages);
realm.copyToRealmOrUpdate(initialMessage);
realm.commitTransaction();
//Handle exceptions...
但在此之后,内部对象“nestedMessages”被重置,大小为零。
这里有什么我想念的吗?或者Realm是否以不同的方式为这种用例工作?
NewMessage是此响应的结果:
protected Response<Message> parseNetworkResponse(NetworkResponse response) {
if (isReqSuccessful(response)) {
try {
Gson gson = realmGson();
String json = new String(
response.data,
HttpHeaderParser.parseCharset(response.headers));
return Response.success(
gson.fromJson(json, Message.class),
HttpHeaderParser.parseCacheHeaders(response));
} catch (UnsupportedEncodingException e) {
return Response.error(new ParseError(e));
} catch (JsonSyntaxException e) {
return Response.error(new ParseError(e));
}
}
return Response.error(new VolleyError());
}
答案 0 :(得分:3)
如果您的newMessage由gson.fromJson(json, Message.class)
定义,则只需要执行几项操作即可将其添加到initialMessage.nestedMessages。
由executeTransaction()
自动处理开始和提交交易(以及在发生故障时取消)。
应该像这个一样简单
Message newMessage = parseNetworkResponse bla bla
realm.executeTransaction(new Realm.Transaction() { // 1
@Override
public void execute(Realm realm) {
newMessage = realm.copyToRealmOrUpdate(newMessage); // 2
initialMessage.getNestedMessages().add(newMessage); // 3
}
}); // 4
不需要realm.copyToRealmOrUpdate(initialMessage);
,因为当您向nestedMessages添加项目并提交时,它会自动更新。
同样RealmList<Message> nestedMessages = initialMessage.getNestedMessages();
是一个不必要的副本,需要更多内存,所以我建议你不要这样做。
答案 1 :(得分:1)
恩,没有领域不这样做。我真的不知道它是如何与列表交互的,但是尝试第一个解决方案,如果它不起作用,第二个解决方案肯定会这样做:
的 1 强>
realm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
RealmList<Message> nestedMessages = initialMessage.getNestedMessages();
newMessage = realm.copyToRealmOrUpdate(newMessage);
nestedMessages.add(newMessage);
}
});
<强> 2 强>
RealmList<Message> nestedMessages = new RealmList<Message>();
RealmList<Message> oldMessages = initialMessage.getNestedMessages();
for(Message message: oldMessages){
nestedMessages.add(message);
}
newMessage = realm.copyToRealmOrUpdate(newMessage);
nestedMessages.add(newMessage);
initialMessage.setNestedMessages(nestedMessages);
realm.copyToRealmOrUpdate(initialMessage);