Android - 具有主键的领域关系列表

时间:2016-09-12 16:55:25

标签: android database realm relationship

聊天室:

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

1 个答案:

答案 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();