聊天室:
public class ChatRoom extends RealmObject{
@PrimaryKey
int chatRoomID;
RealmList<ChatMessage> chatMessages;
//getters & setters ...
}
消息类:
public class ChatMessage extends RealmObject {
int chatMessageID;
String chatMessageContent;
User author;
//getters & setters ...
}
用户:
public class User extends RealmObject {
@PrimaryKey
int Id;
String Name;
//getters & setters ...
}
第一次创建chatmessage是好的但是第二次出现错误:值已经存在:5 [用户ID]
如何在添加到chatmessage列表而不是创建新用户对象时更新用户对象?
这是我添加新chatMessage的方式:
mRealm.beginTransaction();
ChatRoom chatRoom = mRealm.where(ChatRoom.class).equalTo("chatRoomID", chatRoomID)
.findFirst();
chatRoom.getChatMessages().add(chatMessage); // add to the list
mRealm.commitTransaction();
答案 0 :(得分:1)
这是因为chatMessage
是一个非托管RealmObject
并且它具有相同的主键,其中一个主要由Realm保存。
因此,如果一个对象是非托管对象,当将其添加到托管RealmList
时,Realm将尝试创建它。当具有相同pk的对象已经存在时,将抛出异常。
要解决此问题,请先使用copyToRealmOrUpdate()
获取托管RealmObject
,然后添加,例如:
ChatMessage ch = new ChatMessage();
ch.SetChatMessageID(someId);
ch.setChatMessageContent("text");
ch.setChatMessageAuthor(author);
mRealm.beginTransaction();
ch = mRealm.copyToRealmOrUpdate(ch); // get/create a managed RealmObject
ChatRoom chatRoom = mRealm.where(ChatRoom.class).equalTo("chatRoomID", chatRoomID)
.findFirst();
chatRoom.getChatMessages().add(ch); // add to the list
mRealm.commitTransaction();