gpt4 book ai didi

android - 将 LiveData 与包含的不同对象合并

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:51:14 29 4
gpt4 key购买 nike

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

在进入 fragment 级别之前,我想在某个级别合并这两个数据集,但不确定如何操作。我知道我可以直接从数据库中使用查询创建一个 POJO,但我有点想要一个包含 PayeeTransaction 对象,而不仅仅是来自两个字段的所有字段.

有没有办法做到这一点?也许使用其中一种转换(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;

. . .
}

最佳答案

包含收款人的交易对象将由@Embedded 注释生成,独立于您的 DAO 查询中的附加列。

还有其他与您的问题相关的场景:

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

使用全局执行程序池,如 Google GithubBrowserSample 示例中的 AppExecutor 所示类,存储库类中的嵌套查询将像这样结束:

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 注释的类并具有如下定义的 quotationDetList 属性:

@Ignore
public List<QuotationDetProductUnit> quotationDetList;

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

关于android - 将 LiveData 与包含的不同对象合并,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48455844/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com