如何在Android Room查询中返回超类?

时间:2018-04-20 21:17:29

标签: java android android-room android-livedata

我正在从SQL查询生成多种类型的报告(日,周,月)。报告具有相同的属性,但涵盖不同的时期,并且具有共同的标题结构。为了解决这个问题,我使用Report作为抽象类来定义属性和必需的方法。

我的目标是以一种可以使用Report类从多态性中受益的方式构建我的代码。我希望能够将子类转换回原始超类,以便我的PagedListAdapter可以处理多种类型的报告。我怎么能做到这一点?我一直在尝试使用通配符,但没有成功。

我替换LiveData个实例的原因是为了确保只有一个LiveData订阅了PagedListAdapter

ReportDao.java

@Dao
public abstract class ReportDao {

    @Query(...)
    abstract DataSource.Factory<Integer, Week> getWeekReports();

    @Query(...)
    abstract DataSource.Factory<Integer, Month> getMonthReports();

    @Query(...)
    abstract DataSource.Factory<Integer, Year> getYearReports();

}

ReportsViewModel

public class ReportsViewModel extends ViewModel {

    private static final int TYPE_WEEK = 0;
    private static final int TYPE_MONTH = 1;
    private static final int TYPE_YEAR = 2;

    private final ReportDao reportDao;

    private LiveData<PagedList<Report>> reports;

    public ReportsViewModel(ReportDao reportDao) {
        this.reportDao = reportDao;
    }

    public LiveData<PagedList<Report>> getReports(int type) {
        switch (type) {
            case TYPE_WEEK:
                reports = new LivePagedListBuilder<>(reportDao.getWeekReports(), 20)
                        .build(); // this wont compile
            case TYPE_MONTH:
                ....
        }

        return reports;
    }

}

0 个答案:

没有答案