如何用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实时数据库截图:
内容的提问来源于stack exchange,提问作者Ammar Bakr
相关产品推荐
相关产品推荐

