2017-10-07 6 views
1

私は最近Realmを使用し始めました。最初に、1つのクラス、つまり1つのオブジェクトを保存すると、それは明らかです。しかし、フィールドにカスタム型を持つクラスを格納する場合、それらは同じことがあります。レルムに関連するクラスを保存する方法は?

です:だから

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

iffyを見て、Realmインスタンスが終了しても閉じられていない 'attachmentList'以外は、それは正常に見えます。 – 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

と私は上記に書いた方法を記述した場合問題では、正しく動作します –

関連する問題