2017-12-20 7 views
2

私は2つのモデル(テーブル)、WordGroupsWordsを持っており、それらの間の関係は1対多です。 だから私のモデルなどDao外観:Androidの部屋:LiveDataとの関係

public LiveData<WordGroup> getWordGroupWithWords(int id) { 
    LiveData<WordGroup> wordGroupLiveData = dao.selectWordGroupById(id); 

    LiveData<WordGroup> wordGroupWithWordsLiveData = Transformations.switchMap(wordGroupLiveData, inputWordGroup -> { 
     LiveData<List<Word>> wordsLiveData = dao.selectWordsByWordGroupId(inputWordGroup.getId()); 

     LiveData<WordGroup> outputWordGroupsLiveData = Transformations.map(wordsLiveData, inputWords -> { 
      inputWordGroup.setWords(inputWords); 
      return inputWordGroup; 
     }); 

     return outputWordGroupsLiveData; 
    }); 

    return wordGroupWithWordsLiveData; 
} 

@Entity 
public class WordGroup { 

    @PrimaryKey 
    private int id; 

    @Ignore 
    private List<Word> words; 

    public int getId() { 
     return id; 
    } 

    public void setId(int id) { 
     this.id = id; 
    } 

    public List<Word> getWords() { 
     return words; 
    } 

    public void setWords(List<Word> words) { 
     this.words = words; 
    } 
} 

@Entity 
public class Word { 

    @PrimaryKey 
    private int id; 

    @ForeignKey(entity = WordGroup.class, parentColumns = "id", childColumns = "wordGroupId") 
    private int wordGroupId; 

    public int getId() { 
     return id; 
    } 

    public void setId(int id) { 
     this.id = id; 
    } 

    public int getWordGroupId() { 
     return wordGroupId; 
    } 

    public void setWordGroupId(int wordGroupId) { 
     this.wordGroupId = wordGroupId; 
    } 
} 

@Dao 
public interface Dao { 

    @Query("select * from WordGroup where id = :id") 
    LiveData<WordGroup> selectWordGroupById(int id); 

    @Query("select * from WordGroup") 
    LiveData<List<WordGroup>> selectAllWordGroups(); 

    @Query("select * from Word where wordGroupId = :wordGroupId") 
    LiveData<List<Word>> selectWordsByWordGroupId(int wordGroupId); 
} 

は、今私はWordGroupを選択してもTransformationsを使用して、そのWord秒を設定する方法を持っています私はWordGroupのすべてを選択する方法を書いて、各WordGroupの場合はです。まあ、私は少しを試してみましたが、私はMediatorLiveDataの助けを借りて、この解決策を考え出した

public LiveData<List<WordGroup>> getAllWordGroupsWithWords(); 

答えて

0

public LiveData<List<WordGroup>> getAllWordGroupsWithWords() { 
    LiveData<List<WordGroup>> wordGroupsLiveData = dao.selectAllWordGroups(); 
    LiveData<List<WordGroup>> outputWordGroups = Transformations.switchMap(wordGroupsLiveData, inputWordGroups -> { 
     MediatorLiveData<List<WordGroup>> wordGroupsMediatorLiveData = new MediatorLiveData<>(); 
     for (WordGroup wordGroup : inputWordGroups) { 
      wordGroupsMediatorLiveData.addSource(dao.selectWordsByWordGroupId(wordGroup.getId()), words -> { 
       wordGroup.setWords(words); 
       wordGroupsMediatorLiveData.postValue(inputWordGroups); 
      }); 
     } 

     return wordGroupsMediatorLiveData; 
    }); 

    return outputWordGroups; 
} 

今では正確な方法であるメソッドのシグネチャは次のようなものでなければなりません私は欲しかったが、大きな問題がいくつかある。

  • まず、それはあなたがあなたのMediatorLiveData上の方法setValueを使用している場合、私はそれはあなたが1つの単語だけを変更した場合でもpostValue

  • セカンドを使って観測者が少ない回呼び出す作ることができ、観察を何度も呼び出します。それは再びwordGroupのためにオブザーバーを呼ぶでしょう!

もちろん、最適化されたソリューションではありませんが、機能します。私は本当に提案と改善にオープンしています。

+0

この記事をチェックしてくださいhttps://medium.com/@rezabigdeli6/android-room-handling-relations-using-livedata-2d892e40bd53 –

関連する問題