6

所以我正在使用 Room 和 LiveData 编写一个应用程序。这是一个金融应用程序。我有两个要合并的实体,PayeeTransactionTransaction有一个 ForeignKey 将其链接到Payee。我一直使用 Room 中的 LiveData(Daos、Repository、ViewModels)到我的 UI(片段)。

在达到片段级别之前,我想在某个级别合并这两个数据集,但不知道该怎么做。我知道我可以直接从数据库中创建一个带有查询的 POJO,但我有点想要一个带有Payee的事务对象,而不是两者中的所有字段。

有没有办法做到这一点?也许使用其中一种转换(map 或 switchMap)?或者也许使用 MediatorLiveData?他们能否观察到不止一种数据类型(例如 LiveData 和 LiveData)?

收款人.java

@Entity
public class Payee {

    @PrimaryKey (autoGenerate = true)
    @ColumnInfo (name = "id")
    private int id;

    . . . 
}

事务.java

@Entity (foreignKeys =
        @ForeignKey(entity = Payee.class, 
                             parentColumns = "id", 
                             childColumns = "payee_id", 
                             onDelete = RESTRICT))
public class Transaction {

    @PrimaryKey (autoGenerate = true)
    @ColumnInfo (name = "id")
    private int id;

    @ColumnInfo (name = "payee_id")
    private int payeeId;
    @Ignore
    private Payee payee;

    . . .
}
4

1 回答 1

5

包含 Payee 的 Transaction 对象将由 @Embedded 注释生成,与您的 DAO 查询中的附加列无关。

还有其他与您的问题相关的情况:

  • 需要完全独立查询的实体。将需要具有多个 Source 的 MediatorLiveData。
  • 由@Relation 注释生成的默认 SELECT * FROM 查询无法满足的具有一对多关系的实体。可以使用 Transformations.switchMap ,如下所述(我在搜索此问题时发现了您的问题)。

使用全局执行器池,如带有AppExecutor类的 Google GithubBrowserSample 示例中所示,存储库类中的嵌套查询最终将如下所示:

public LiveData<QuotationCustomer> loadQuotationDetails(int quotationId) {
    LiveData<QuotationCustomer> quotationLiveData =
            quotationDao.getQuotationCustomer(quotationId);
    LiveData<QuotationCustomer> result =
            Transformations.switchMap(quotationLiveData, quotation -> {
        MutableLiveData<QuotationCustomer> mutableResult = new MutableLiveData<>();
        appExecutors.diskIO().execute(() -> {
            quotation.quotationDetList = 
                    quotationDetDao.getQuotationDetsByQuotationIdSync(quotationId);
            mutableResult.postValue(quotation);
        });
        return mutableResult;
    });
    return result;
}

在前面的代码示例中,getQuotationDetsByQuotationIdSync DAO 方法返回一个普通列表(不是 LiveData>),并且 QuotationCustomer POJO 扩展了一个 @Entity 注释类,并具有如下定义的 quoteDetList 属性:

@Ignore
public List<QuotationDetProductUnit> quotationDetList;

在您的情况下,将 QuotationCustomer 替换为 Payee,将 QuotationDetProductUnit 替换为 Transaction。

于 2018-03-14T02:13:05.957 回答