gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 12:56:55 25 4
gpt4 key购买 nike

我有一个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。现在有些东西没有按预期工作...有关如何解决此问题或如何进一步调试此问题有什么想法吗?

最佳答案

每次您在聊天中添加消息对象时,这是错误的,您必须替换消息对象,以防找到具有相同 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);

希望这对您和其他人有帮助

关于java - Realm .copyToRealmOrUpdate() 导致出现重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35322997/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com