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

问题描述 投票:1回答:1

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

讨论课

@PrimaryKey
private String discussion_id;

private RealmList<Message> messages;
// More declarations + generated getters & setters

消息类

@PrimaryKey
private String msgID;

private String message;
//Declarations + 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();

每次调用AsyncTask后我都运行了Log.d("MESSAGES TOTAL","=="+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。现在有些东西没有按预期工作......有关如何解决此问题或如何进一步调试的任何想法?

java android android-asynctask realm
1个回答
0
投票

每次在Chat中添加Message对象时都会出现错误,如果找到相同的massage_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);

希望这能帮助你和其他好运

© www.soinside.com 2019 - 2024. All rights reserved.