2017-12-20 24 views
2

두 모델 (테이블) WordGroupsWords이 있으며 그 사이의 관계는 1 대 다수입니다. 그래서 내 모델과 같은 Dao보기 :Android 룸 : LiveData와의 관계

@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를 선택하고 메소드가 설정 한 그 WordTransformations 사용 : 지금

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; 
} 

모든 WordGroup을 선택하는 방법을 쓰고 싶습니다. 또한를 설정합니다. 각 WordGroup에 대해s입니다.

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

답변

0

그럼 내가 조금 더 노력하고 내가 MediatorLiveData의 도움으로이 솔루션을 내놓았다 : 지금

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을 사용하는 경우 첫 번째는 관찰자 여러 번 호출합니다, 나는 당신이 하나 개의 단어를 변경하는 경우에도이 postValue

  • 둘째 사용하여 관찰자에게 더 적은 시간을 호출 할 수 있습니다 , 다시 각 wordGroup에 대한 관찰자를 호출합니다!

물론 가장 최적화 된 솔루션은 아니지만 작동합니다. 나는 제안과 개선에 정말로 열려있다.

+0

이 기사를 확인하십시오. https://medium.com/@rezabigdeli6/android-room-handling-relations-using-livedata-2d892e40bd53 –