Android中使用Firebase Push后如何展示Expenses数据值?
如何从Firebase展示你的Expenses费用数据
看起来你已经搞定了数据写入Firebase的部分,现在卡在读取展示这一步对吧?别担心,我来一步步帮你解决。
首先,先明确下你当前的数据结构(根据你的代码推断),大概是这样的:
Users |--- [当前用户UID] |--- [Push生成的唯一ID1] |--- expenses: [total数值] |--- items: [你输入的项目文本] |--- [Push生成的唯一ID2] |--- expenses: [另一个total数值] |--- items: [另一个项目文本]
接下来分步骤实现读取和展示:
1. 获取正确的数据库引用
首先你需要指向当前用户下的所有费用记录节点,而不是单个push节点:
DatabaseReference userExpensesRef = mRef.child("Users/" + mAuth.getCurrentUser().getUid());
2. 添加数据监听并读取数据
Firebase提供了两种监听方式:
addValueEventListener:实时监听数据变化,数据更新时自动回调addListenerForSingleValueEvent:仅读取一次数据
毕设里通常实时更新更实用,所以用第一种为例:
基础版读取(直接处理字段)
// 假设你有一个列表来存储费用数据,比如用于RecyclerView或者TextView展示 List<String> expenseDisplayList = new ArrayList<>(); userExpensesRef.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { // 每次数据更新先清空旧数据 expenseDisplayList.clear(); // 遍历所有push生成的费用节点 for (DataSnapshot expenseSnapshot : snapshot.getChildren()) { // 读取expenses字段的值 Double totalExpense = expenseSnapshot.child("expenses").getValue(Double.class); // 读取items字段的值 String itemInfo = expenseSnapshot.child("items").getValue(String.class); // 组装展示文本 String displayContent = String.format("费用: %.2f | 项目: %s", totalExpense, itemInfo); expenseDisplayList.add(displayContent); } // 更新UI:这里根据你的展示方式调整 // 示例1:用TextView展示所有记录 TextView expenseTextView = findViewById(R.id.expense_text_view); expenseTextView.setText(String.join("\n\n", expenseDisplayList)); // 示例2:用RecyclerView展示(需要提前配置适配器) // expenseAdapter.notifyDataSetChanged(); } @Override public void onCancelled(@NonNull DatabaseError error) { // 处理读取失败的情况 Toast.makeText(getApplicationContext(), "读取费用数据失败: " + error.getMessage(), Toast.LENGTH_SHORT).show(); } });
进阶版:用模型类管理数据(更规范)
毕设推荐用模型类来封装数据,代码更清晰。先创建一个Expense类:
public class Expense { private Double expenses; private String items; // Firebase要求必须有空构造函数 public Expense() {} public Expense(Double expenses, String items) { this.expenses = expenses; this.items = items; } // Getter和Setter方法 public Double getExpenses() { return expenses; } public void setExpenses(Double expenses) { this.expenses = expenses; } public String getItems() { return items; } public void setItems(String items) { this.items = items; } }
然后读取的时候直接映射到模型类:
List<Expense> expenseList = new ArrayList<>(); userExpensesRef.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { expenseList.clear(); for (DataSnapshot expenseSnapshot : snapshot.getChildren()) { // 直接将数据映射到Expense对象 Expense expense = expenseSnapshot.getValue(Expense.class); expenseList.add(expense); } // 后续UI更新就可以基于Expense对象来处理,比如RecyclerView的适配器可以绑定Expense数据 expenseAdapter.notifyDataSetChanged(); } @Override public void onCancelled(@NonNull DatabaseError error) { Toast.makeText(getApplicationContext(), "读取失败: " + error.getMessage(), Toast.LENGTH_SHORT).show(); } });
3. 重要提醒:数据库规则配置
确保你的Firebase数据库规则允许当前用户读取自己的数据,测试阶段可以用以下规则(发布前记得调整为更严格的规则):
{ "rules": { "Users": { "$uid": { ".read": "$uid === auth.uid", ".write": "$uid === auth.uid" } } } }
如果还有问题,比如UI展示的具体细节(比如RecyclerView的配置),可以补充你的布局代码或者展示需求,我再帮你细化~
内容的提问来源于stack exchange,提问作者Martin Rahmad
相关产品推荐
相关产品推荐

