无法弄清楚如何使用 pojo 从一个房间实体构建 ViewPager2 的数据



我是Android新手,需要一些帮助。 我正在制作一个管理费用的应用程序。我有房间数据库表"费用":

成本条目.java

@Entity(tableName = "expenses")
public class CostEntry {
@PrimaryKey(autoGenerate = true)
private int id;
private String category;
private String name;
private int cost;
private String date;
private String currency;
//....
}

我的活动显示特定日期的所有费用。 现在,我想制作 viewpager2,其页面将显示所有类别及其总和 - 特别是货币(页数等于不同货币的数量(。

所以,我做了一个简单的pojo:

总成本波乔.java

public class TotalCostPojo {
public TotalCostPojo() {
}
private String currency;
private List<String> category;
private List<Integer> categoryCosts;

public String getCurrency() {
return currency;
}
public void setCurrency(String currency) {
this.currency = currency;
}
public List<String> getCategory() {
return category;
}
public void setCategory(List<String> category) {
this.category = category;
}
public List<Integer> getCategoryCosts() {
return categoryCosts;
}
public void setCategoryCosts(List<Integer> categoryCosts) {
this.categoryCosts = categoryCosts;
}
}

但是,我收到一个错误:

错误:无法弄清楚如何从游标读取此字段。 私有列表类别成本;私人列表类别;

这是我的道:

@Query("SELECT DISTINCT currency, category, SUM (cost) AS categoryCosts FROM expenses WHERE date = :date group by category")
LiveData<List<TotalCostPojo>> loadTotalCategoryCosts(String date);

我以前有类似的问题,但后来我用@Relation注释解决了它。我不知道如何在这里做到这一点,因为没有一个以上的实体。

提前谢谢。

我认为在 Room 中没有内置的方式来满足您的需求(正如您所写的,这不是@Relation注释的情况,因为没有两个真正的表可以连接(。 我只能建议您可以尝试的解决方法(可能这是一个明显的样板文件,并且您期望更优雅,但仍然是一种方式(:

  1. 添加类CostPojo,其中包含以下字段:货币(字符串(、类别(字符串(、类别成本(整数(。
  2. loadTotalCategoryCosts中的返回值类型更改为List<CostPojo>
LiveData<List<CostPojo>> loadTotalCategoryCosts(String date);
  1. 要获得ViewPager所需的数据结构,您必须创建自己的从List<CostPojo>List<TotalCostPojo>的转换函数。为此,您可以使用 LiveData 转换,或者例如将静态辅助方法convertToTotalCost添加到CostPojo类(输入 -List<CostPojo>、输出 -List<TotalCostPojo>(。

更新 对于那些感兴趣的人 - 基于问题作者提出的此答案的最终解决方案在单独的答案中

上面的答案绝对是正确的,我只想添加一些代码来阐明变换函数并将List<CostPojo>转换为List<TotalCostPojo>。也许有人会觉得这很有用,我以前对此一无所知。另外,如果我犯了一些错误,或者我可以做得更好,请指出这一点。

总成本波乔.java

public class TotalCostPojo {
public TotalCostPojo() {
}
private String currency;
private Map<String, Integer> categoryCosts;

所有其他内容都在ViewModel中(从数据库获取LiveData并转换为List<TotalCostPojo

public class DailyExpensesViewModel extends ViewModel {
private LiveData<List<CostPojo>> categoryCosts;
public DailyExpensesViewModel(CostDatabase database, String date) {
categoryCosts = database.costDao().loadCategoryCosts(date);
}
public LiveData<List<TotalCostPojo>> getTotalCategoryCosts() {
return Transformations.map(categoryCosts, this::convertToTotalCost);
}
private List<TotalCostPojo> convertToTotalCost(List<CostPojo> costPojo) {
List<TotalCostPojo> totalCostPojos = new ArrayList<>();
List<String> helpPair = new ArrayList<>();
List<String> helpCurrency = new ArrayList<>();
for (CostPojo costPojo1 : costPojo) {
//new TotalCostPojo, new currency
if (!helpCurrency.contains(costPojo1.getCurrency())) {
TotalCostPojo obj = new TotalCostPojo();
obj.setCurrency(costPojo1.getCurrency());
Map<String, Integer> catCost = new TreeMap<>();
catCost.put(costPojo1.getCategory(), costPojo1.getCategoryCosts());
obj.setCategoryCosts(catCost);
totalCostPojos.add(obj);
//fill helper lists:
helpCurrency.add(costPojo1.getCurrency());
helpPair.add(costPojo1.getCurrency() + costPojo1.getCategory());
//---------------------------------------
// same currency, new category
} else if (!helpPair.contains(costPojo1.getCurrency() + costPojo1.getCategory())) {
for (TotalCostPojo tcp : totalCostPojos) {
if (tcp.getCurrency().equals(costPojo1.getCurrency())) {
Map<String, Integer> catCost = tcp.getCategoryCosts();
catCost.put(costPojo1.getCategory(), costPojo1.getCategoryCosts());
tcp.setCategoryCosts(catCost);
//fill helper lists:
helpPair.add(costPojo1.getCurrency() + costPojo1.getCategory());
//-------------------
}
}
//same currency, same category, updating costValue
} else if (helpPair.contains(costPojo1.getCurrency() + costPojo1.getCategory())) {
for (TotalCostPojo tcp : totalCostPojos) {
if (tcp.getCurrency().equals(costPojo1.getCurrency())) {
Map<String, Integer> catCost = tcp.getCategoryCosts();
Integer oldValue = catCost.put(costPojo1.getCategory(), costPojo1.getCategoryCosts());
if (oldValue != null) {
catCost.put(costPojo1.getCategory(), costPojo1.getCategoryCosts() + oldValue);
tcp.setCategoryCosts(catCost);
}
}
}
}
}
helpPair.clear();
helpCurrency.clear();
return totalCostPojos;
}
}

最新更新