Java Realm.copyToRealmOrUpdate()导致出现重复项

Java Realm.copyToRealmOrUpdate()导致出现重复项,java,android,android-asynctask,realm,Java,Android,Android Asynctask,Realm,我有一个AsyncTask,当用户想要手动重新加载他的讨论消息时使用它(从我们的服务器获取用户拥有的每个讨论的20条最新消息)。由于某些原因,以这种方式获取的所有消息都会被复制。每次运行任务都会创建更多的副本。第一次运行不会创建重复项,但之后的每次运行都会。。。值得一提的是,我使用socket.io与服务器进行通信,以便在收到响应时触发一个新线程 讨论课 @PrimaryKey private String discussion_id; private RealmList<Message

我有一个
AsyncTask
,当用户想要手动重新加载他的讨论消息时使用它(从我们的服务器获取用户拥有的每个讨论的20条最新消息)。由于某些原因,以这种方式获取的所有消息都会被复制。每次运行任务都会创建更多的副本。第一次运行不会创建重复项,但之后的每次运行都会。。。值得一提的是,我使用socket.io与服务器进行通信,以便在收到响应时触发一个新线程

讨论课

@PrimaryKey
private String discussion_id;

private RealmList<Message> messages;
// More declarations + generated getters & setters
下面是AsyncTask中的简化部分,它将消息信息保存到数据库中

 for (msgData : receivedMessages)
    {
        Message msg = new Message();
       // Set all relevant data

        realm.beginTransaction();
        chat.getMessages().add(msg);
        realm.copyToRealmOrUpdate(chat);
        realm.commitTransaction();
    }

    realm.beginTransaction();
    chat.setPreview(chat.getMessages().last().getMessage());
    chat.setLastMessage(chat.getMessages().last().getCreated());
    realm.copyToRealmOrUpdate(chat);
    realm.commitTransaction();

    realm.close();
我运行了
Log.d(“MESSAGES TOTAL”,“MESSAGES=”+chat.getMessages().size())
D/MESSAGES TOTAL: ==20
D/MESSAGES TOTAL: ==40
D/MESSAGES TOTAL: ==60
当然我跑了

String id =chat.getMessages().first().getMsgID();
long count = realm.where(Message.class).equalTo("msgID",id).count();
Log.d("FIRST ITEM ID", id+"- COUNT:"+count);
得到

D/FIRST ITEM ID: 56bb693593de502003681054- COUNT:1
现在我已经陷入了疯狂的深渊,我把聊天中的每一条信息都打印到了控制台上,并查看了ID,这就是我发现的

02-10 20:08:38.097 13339-13339/com.dev.proto D/DISCUSSIONACTIVITY:: CREATED: Wed Feb 10 16:45:41 EET 2016--MSG ID: 56bb693593de502003681054
02-10 20:08:38.097 13339-13339/com.dev.proto D/DISCUSSIONACTIVITY:: CREATED: Wed Feb 10 16:45:41 EET 2016--MSG ID: 56bb693593de502003681054
02-10 20:08:38.107 13339-13339/com.dev.proto D/DISCUSSIONACTIVITY:: CREATED: Wed Feb 10 16:45:41 EET 2016--MSG ID: 56bb693593de502003681054

三个相同的消息ID。现在有些东西没有按预期工作。。。关于如何修复此问题或如何进一步调试此问题,您有什么想法吗?

每次在聊天中添加错误的消息对象时,您都必须替换消息对象,以防找到具有相同消息id的对象

Discussion mDiscussion = realm.where(Discussion.class).equalTo("id", DiscussionID).findFirst();          
Message mMessage = mDiscussion.getMessages().where().equalTo("id",updatedMessage.getId()).findFirst();
if(null!=mMessage&&  mDiscussion.getMessages().indexOf(mMessage)!=-1){
    //if Simmilar Message Object present in mDiscussion.getMessages() then replace
    mDiscussion.getMessages().set(mDiscussion.getMessages().indexOf(mMessage),taskfinal);
}else{
    //if not then add Message  to list
    mDiscussion.getMessages().add(taskfinal);
} 
 realm.copyToRealmOrUpdate(mDiscussion);

希望这对您和其他幸运儿有所帮助

每当您在聊天中添加错误的消息对象时,您必须更换消息对象,以防找到具有相同消息id的对象

Discussion mDiscussion = realm.where(Discussion.class).equalTo("id", DiscussionID).findFirst();          
Message mMessage = mDiscussion.getMessages().where().equalTo("id",updatedMessage.getId()).findFirst();
if(null!=mMessage&&  mDiscussion.getMessages().indexOf(mMessage)!=-1){
    //if Simmilar Message Object present in mDiscussion.getMessages() then replace
    mDiscussion.getMessages().set(mDiscussion.getMessages().indexOf(mMessage),taskfinal);
}else{
    //if not then add Message  to list
    mDiscussion.getMessages().add(taskfinal);
} 
 realm.copyToRealmOrUpdate(mDiscussion);

希望这对您和其他幸运儿有所帮助

您从哪里获得
chat
变量?还要注意,如果您执行
复制或更新
,它也会更新您的
消息
列表。它通过清除并添加所有新项目来实现这一点,但不会删除任何不再在列表中的消息,因为它们可能会从其他地方引用。这可能是您看到重复的原因。
chat
是在循环之前从领域中检索的。我将查看用于显示结果的库。可能我确实有
RealmResult
形式的引用。我会告诉你发生了什么。我从未找到解决这个问题的方法,但我们通过更改服务器端的更新逻辑解决了这个问题。当我有空闲时间时,我可能会仔细研究一下……这都是因为这应该是一个事务,您应该直接为此用例创建托管对象——如果您使用托管RealmList并将托管RealmObject添加到其中,这样就不会发生重复。从哪里获取
chat
变量?还要注意,如果您执行
复制或更新
,它也会更新您的
消息
列表。它通过清除并添加所有新项目来实现这一点,但不会删除任何不再在列表中的消息,因为它们可能会从其他地方引用。这可能是您看到重复的原因。
chat
是在循环之前从领域中检索的。我将查看用于显示结果的库。可能我确实有
RealmResult
形式的引用。我会告诉你发生了什么。我从未找到解决这个问题的方法,但我们通过更改服务器端的更新逻辑解决了这个问题。当我有空闲时间时,我可能会仔细研究一下……这都是因为这应该是一个事务,并且您应该直接为此用例创建托管对象——如果您使用托管RealmList并将托管RealmObject添加到其中,那么就不会发生重复。