2016-09-12 27 views
0

聊天室境界關係列表:的Android - 與主鍵

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方式:

mRealm.beginTransaction(); 
     ChatRoom chatRoom = mRealm.where(ChatRoom.class).equalTo("chatRoomID", chatRoomID) 
       .findFirst(); 
     chatRoom.getChatMessages().add(chatMessage); // add to the list 
     mRealm.commitTransaction(); 
+0

你是如何創建'chatMessage'? – beeender

+0

ChatMessage ch = new ChatMessage(); ch.SetChatMessageID(someId); ch.setChatMessageContent( 「文本」); ch.setChatMessageAuthor(作者); –

回答

1

正是由於chatMessage是一個非託管RealmObject,它具有相同的主鍵與一個由境界已經保存。

所以如果一個對象是非託管對象,當它添加到一個託管的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(); 
+0

如果我不得不更新聊天消息,該怎麼辦?如果只有一個realmobject,並且我想要做類似chatRoom.setChatMessage(ch)的事情?我怎樣才能做到這一點 – swati