Android Room:处理与LiveData的关系

Android Room:处理与LiveData的关系,android,android-room,android-livedata,Android,Android Room,Android Livedata,所以我有两个模型(表),词组和词,它们之间的关系是一对多的。 因此,我的模型和Dao看起来像: @Entity public class WordGroup { @PrimaryKey private int id; @Ignore private List<Word> words; public int getId() { return id; } public void setId(int id) {

所以我有两个模型(表),
词组
,它们之间的关系是一对多的。 因此,我的模型和
Dao
看起来像:

@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;
    }
}
现在我想写一个方法,选择所有
WordGroup
s,并为每个
WordGroup
设置它们的
Word
s。方法的签名应类似于:

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

我尝试了更多,在
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;
}
public LiveData getAllWordGroupsWithWords(){
LiveData wordGroupsLiveData=dao。选择AllWordGroups();
LiveData outputWordGroups=Transformations.switchMap(wordGroupsLiveData,inputWordGroups->{
MediatorLiveData wordGroupsMediatorLiveData=新的MediatorLiveData();
for(字组字组:inputWordGroups){
wordgroupsmeditorlivedata.addSource(dao.selectWordsByWordGroupId(wordGroup.getId()),words->{
wordGroup.setWords(words);
wordGroupsMediatorLiveData.postValue(inputWordGroups);
});
}
返回字GroupsMediatorLiveData;
});
返回outputWordGroups;
}
现在这正是我想要的方式,但是有一些大问题

  • 首先,如果您在
    MediatorLiveData
    上使用方法
    setValue
    ,它将多次调用观察者,我可以通过使用
    postValue
    减少它调用观察者的次数

  • 第二,即使您只更改一个单词,它也会再次调用每个
    单词组的观察者

当然,这不是最优化的解决方案,但它确实有效。我非常乐意接受建议和改进。

请查看本文
public LiveData<List<WordGroup>> getAllWordGroupsWithWords();
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;
}