You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:50:27