【问题标题】:Realm - Inner realm list object is not updated after copyToRealmOrUpdate()领域 - 内部领域列表对象在 copyToRealmOrUpdate() 之后未更新
【发布时间】:2016-06-15 09:58:13
【问题描述】:

我有一个名为 Message 的 Realm 对象(下面的 sn-p),其中也可以包含相同类型的嵌套消息:

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());
}

【问题讨论】:

  • 什么是newMessage?你在哪里创建它
  • 新消息是对我提出@TimCastelijns 的请求的响应
  • 你能显示你为newMessage赋值的代码吗
  • @TimCastelijns 上面添加了新的消息响应

标签: android realm


【解决方案1】:

如果您的 newMessage 是由 gson.fromJson(json, Message.class) 定义的,您只需要做几件事即可将其添加到 initialMessage.nestedMessages。

  1. 开始交易
  2. 将 newMessage 插入领域
  3. 将其添加到nestedMessages。
  4. 提交事务

开始和提交事务(并在失败的情况下取消)由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&lt;Message&gt; nestedMessages = initialMessage.getNestedMessages(); 是不必要的副本,需要更多内存,所以我建议你也不要这样做。

【讨论】:

  • 这不是和我的回答一样吗?
  • @DrilonBlakqori 我在自己的代码中使用过它,我理解它是如何工作的,并且我能够解释一些关于它的事情。您提供了 2 个 sn-ps 代码,根本没有任何解释,其中 1 个您没有测试过,另一个非常不实用。所以不,我不认为它是一样的。 OP 现在可能正在使用您的第二个代码 sn-p 因为“它有效”,即使它不是一个好的解决方案
  • 我的第一个解决方案与您的解决方案相同,即使我没有添加解释。编辑我的帖子或发表评论作为解释也可以。无论如何gl进一步
  • @TimCastelijns 请不要对 OP 正在做的事情下结论。
【解决方案2】:

嗯,没有领域不能这样工作。我真的不知道它如何与列表交互,但尝试第一个解决方案,如果它不起作用,第二个肯定会这样做:
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);

【讨论】:

  • 我真的不知道它如何与列表交互那么你怎么可能知道你的答案会起作用?
  • 我自己一直在努力处理领域列表,第二个答案对我有用。在我读到这个realm.io/docs/java/latest/api/io/realm/RealmList.html 之后,我认为第一个可能有用,但我没有尝试。
  • 谢谢,第二个解决方案有效。有点烦人,这对领域来说并不简单
  • 无论如何,你的第二个解决方案是非常不切实际的,即使它有效
  • @TimCastelijns 你能建议一个答案而不是放下他的解决方案。也感谢您的宝贵时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多