2017-10-07 75 views
1

我最近開始使用Realm。首先很明顯,如果您存儲一個類,即一個對象。但是當你想要在字段中存儲具有自定義類型的類時,它們具有相同的功能。如何在Realm中保存相關的類?

即:

class Dog extend RealmObject{ 
private int count; 
private Cat cat; 

// геттеры и сеттеры 
} 

class Cat extend RealmObject{ 
private int count; 
private RealmList<Cow> cowList; 

// геттеры и сеттеры 
} 

class Cow extend RealmObject{ 
private int count; 
private Horse horse; 

// геттеры и сеттеры 
} 

所以,把它保存在數據庫中寫了一堆線:

public void setChatsList(final ChatsModel chatsModel) { 
    Realm realm = Realm.getDefaultInstance(); 

    realm.executeTransaction(new Realm.Transaction() { 
     @Override 
     public void execute(@NonNull Realm realm) { 

      ChatsModel realmChats = realm.createObject(ChatsModel.class); 
      Response realmResponse = realm.createObject(Response.class); 
      Item realmItem = realm.createObject(Item.class); 
      Message realmMessage = realm.createObject(Message.class); 
      Attachment realmAttachment = realm.createObject(Attachment.class); 
      Video realmVideo = realm.createObject(Video.class); 

      Response response = chatsModel.getResponse(); 
      RealmList<Item> items = new RealmList<>(); 
      Integer itemCount = response.getCount(); 
      RealmList<Item> itemList = response.getItems(); 

      if (itemList != null) { 
       for (Item item : itemList) { 
        Message message = item.getMessage(); 

        realmMessage.setId(message.getId()); 
        realmMessage.setDate(message.getDate()); 
        realmMessage.setOut(message.getOut()); 
        realmMessage.setUserId(message.getUserId()); 
        realmMessage.setReadState(message.getReadState()); 
        realmMessage.setTitle(message.getTitle()); 
        realmMessage.setBody(message.getBody()); 
        realmMessage.setRandomId(message.getRandomId()); 
        RealmList<Attachment> attachments = message.getAttachments(); 
        RealmList<Attachment> attachmentList = new RealmList<>(); 

        if (attachments != null) { 
         for (Attachment attachment : attachments) { 
          String type = attachment.getType(); 
          Video video = attachment.getVideo(); 

          realmVideo.setAccessKey(video.getAccessKey()); 
          realmVideo.setCanAdd(video.getCanAdd()); 
          realmVideo.setCanEdit(video.getCanEdit()); 
          realmVideo.setComments(video.getComments()); 
          realmVideo.setDate(video.getDate()); 
          realmVideo.setDescription(video.getDescription()); 
          realmVideo.setDuration(video.getDuration()); 
          realmVideo.setId(video.getId()); 
          realmVideo.setOwnerId(video.getOwnerId()); 
          realmVideo.setPhoto130(video.getPhoto130()); 
          realmVideo.setPhoto320(video.getPhoto320()); 
          realmVideo.setPhoto640(video.getPhoto640()); 
          realmVideo.setPlatform(video.getPlatform()); 
          realmVideo.setTitle(video.getTitle()); 
          realmVideo.setViews(video.getViews()); 

          realmAttachment.setType(type); 
          realmAttachment.setVideo(realmVideo); 

          attachmentList.add(realmAttachment); 
         } 
         realmMessage.setAttachments(attachmentList); 
        } 

        realmResponse.getItems().add(item); 
       } 
      } 

      realmResponse.setCount(itemCount); 
      realmChats.setResponse(realmResponse); 
     } 
    }); 
} 

同意,對於一個任務行是太多了。在我看來,我做錯了

問題:如何正確地做到這一點,以及如何縮短我的方法,告訴我?

+0

除了'attachmentList'看起來有問題,並且Realm實例在完成之後沒有關閉,它看起來好像 – EpicPandaForce

+0

@EpicPandaForce,但是'attachmentList'有什麼問題? –

+0

'realmMessage'是一個託管對象,但'attachmentList'是一個非託管的RealmList。應該是'realmMessage.getAttachments().addAll(attachmentList)'。 – EpicPandaForce

回答

0

我可能會錯過一些更好的細節,但它看起來像只是映射響應1:1。有什麼理由不能直接使用它嗎?

ChatsModel realmChats = realm.createObject(ChatsModel.class); 
realmChats.addResponse(chatsModel.getItems()); 

領域將自動將未管理列表轉換爲受管理列表。

+0

因爲當我這樣做時: 'ChatsModel realmChats = realm.createObject(ChatsModel.class); realmChats.setResponse(chatsModel.getResponse());' 我得到這個錯誤: 'java.lang.IllegalArgumentException異常:「值」不是管理object.'有效 –

+0

,如果我寫我上面寫的方式在問題中,它能正常工作 –