领域 - copyToRealmOrUpdate()之后不更新内部领域列表对象

时间:2016-06-15 09:58:13

标签: android realm

我有一个名为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());
}

2 个答案:

答案 0 :(得分:3)

如果您的newMessage由gson.fromJson(json, Message.class)定义,则只需要执行几项操作即可将其添加到initialMessage.nestedMessages。

  1. 开始交易
  2. 将newMessage插入领域
  3. 将其添加到nestedMessages。
  4. 提交交易
  5. 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);