2017-10-07 80 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

,如果我写我上面写的方式在问题中,它能正常工作 –