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

如何用Kotlin从Firebase实时数据库获取所有支出金额总和

计算Firebase实时数据库中所有支出金额总和的实现方法

实现思路

要计算所有支出的金额总和,需从Firebase实时数据库中筛选出isIncome字段为"false"的记录,遍历这些记录并将amount字段转换为数值类型后累加。

具体实现代码

添加如下函数即可完成计算:

private fun calculateTotalExpense() {
    val myPref = getSharedPreferences("MY_PRE", Context.MODE_PRIVATE)
    val savedUsername = myPref.getString("USERNAME", "Admin").toString()

    // 查询当前用户下所有支出记录(isIncome为false)
    dbRef.orderByChild("isIncome").equalTo("false")
        .orderByChild("savedUsername").equalTo(savedUsername)
        .addListenerForSingleValueEvent(object : ValueEventListener {
            override fun onDataChange(snapshot: DataSnapshot) {
                var totalExpense = 0.0
                for (expenseSnapshot in snapshot.children) {
                    val expense = expenseSnapshot.getValue(ExpenseModel::class.java)
                    expense?.let {
                        try {
                            // 将字符串金额转为Double类型
                            val amount = it.amount.toDouble()
                            totalExpense += amount
                        } catch (e: NumberFormatException) {
                            Snackbar.make(findViewById(android.R.id.content), "部分金额格式错误,已跳过", Snackbar.LENGTH_SHORT).show()
                        }
                    }
                }
                // 展示总支出结果,可替换为UI控件显示
                Snackbar.make(findViewById(android.R.id.content), "总支出: $totalExpense", Snackbar.LENGTH_LONG).show()
            }

            override fun onCancelled(error: DatabaseError) {
                Snackbar.make(findViewById(android.R.id.content), "查询失败: ${error.message}", Snackbar.LENGTH_SHORT).show()
            }
        })
}

关键注意事项

  • 确保ExpenseModel类的字段名与数据库中的键名完全一致,否则无法正确解析数据。
  • 由于amount在数据库中是字符串类型,转换时必须捕获NumberFormatException,避免因格式错误导致崩溃。
  • 代码中加入了按当前用户筛选的逻辑,确保只计算该用户的支出,若不需要可移除orderByChild("savedUsername").equalTo(savedUsername)这一行。
  • 使用addListenerForSingleValueEvent是一次性查询,若需要实时监听总支出变化,可替换为addValueEventListener。

你提供的原代码与数据库截图

原importIncome函数:

private fun importIncome() {
    val myPref = getSharedPreferences("MY_PRE", Context.MODE_PRIVATE)
    val savedUsername = myPref.getString("USERNAME", "Admin").toString()
    //getting values from user and saving them into variables
    val title = etIncTitle.text.toString()
    val description = etIncDescription.text.toString()
    val amount = etIncAmount.text.toString()
    val isIncome: String = "true"

    if (title.isEmpty() or amount.isEmpty() or description.isEmpty()) {
        Snackbar.make(btnImportIncome, "Please Fill all Fields!", Snackbar.LENGTH_SHORT).show()
    } else {
        val expenseID = dbRef.push().key!!
        val expense = ExpenseModel(savedUsername, title, description, amount, isIncome)

        dbRef.child(expenseID).setValue(expense)
            .addOnCompleteListener {
                Snackbar.make(btnImportIncome, "Income Added!", Snackbar.LENGTH_SHORT).show()
                etIncTitle.setText("")
                etIncDescription.setText("")
                etIncAmount.setText("")
            }.addOnFailureListener {
                Snackbar.make(btnImportIncome, "Something went wrong!", Snackbar.LENGTH_SHORT)
                    .show()
            }
    }
}

Firebase实时数据库截图:
Realtime Database

内容的提问来源于stack exchange,提问作者Ammar Bakr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 02:20:54