2016-08-29 5 views
1

1つの曲を1つのバンドに割り当て、1つのバンドに多くの曲を持たせることで、1対多の関係になります。最終的に私はsong.setBand(バンド)を割り当てています。バンドがlistViewから選択されているので、これはすべて意味があります。問題は、バンドで新しいソングを追加しようとして、executeTransationAsyncを操作するときでした。バンドが選択されていなければ動作しましたが、それ以外の場合はスレッドの問題が発生していました。私は現在のスレッドと一緒に働いている間にバンドをもう一度選択しなければならなかった。これを行うためのよりよい解決策がありますか?Androidレルムの1対多の関係。スレッドを扱う

public void add(Song song){ 

    int bandId = song.getBand().getId(); 

    realm.executeTransactionAsync(thisRealm->{ 

       Number nextID = thisRealm.where(Song.class).max("id"); 

       if(nextID != null){ 
        song.setId(nextID.intValue() + 1); 
       }else{ 
        song.setId(0); 
       } 

       Band band = thisRealm.where(Band.class).equalTo("id", bandId).findFirst(); 

       if(band != null){ 
        song.setBand(band); 
       }else{ 
        song.setBand(null); 
       } 

       thisRealm.copyToRealm(song); 
      }, 
      ()->{ 
       publishSubject.onNext(song); 
      }, 
      error->{ 
       publishSubject.onError(error); 
      }); 
} 
+0

もう一方のスレッドのIDに基づいて再クエリするのは、かなり標準的です。 – EpicPandaForce

+0

今のところ、EpicPandaForceによれば、これを再クエリーする必要があります。しかし、私たちはもっと良い解決策に取り組んでいます。https://github.com/realm/realm-java/issues/2187を参照してください。 – beeender

答えて

2

これまでのところ、2016年8月29日現在、これは非同期トランザクションを使用して1対多数の関係を持つオブジェクトを保存する正しい方法です。コメントを残した方々にお手伝いいただき、ありがとうございます。