Java中如何将输入值累加至Firebase Realtime Database现有数值
实现方案
你可以直接修改注册点击逻辑,在写入数据库前先读取原有值累加即可,以下提供两种适配你场景的实现方式:
方案1:先读再写(适合单用户演示场景,逻辑最简单)
直接在点击事件中先拉取现有活跃时长,和新输入的值求和后再写入,修改后的点击代码如下:
registerActivity.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String inputTimeStr = activeMinutes.getText().toString().trim(); // 可以补充空输入的提示逻辑 if (inputTimeStr.isEmpty()) { return; } int newInputTime = Integer.parseInt(inputTimeStr); // 单次读取现有存储值 databaseReference.child("active time").addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { int totalTime = newInputTime; if (snapshot.exists()) { String oldTimeStr = snapshot.getValue(String.class); if (oldTimeStr != null && !oldTimeStr.isEmpty()) { totalTime += Integer.parseInt(oldTimeStr); } } // 累加后回写数据库 databaseReference.child("active time").setValue(String.valueOf(totalTime)); // 原有UI逻辑保留 addActivity.setVisibility(View.VISIBLE); registerActivity.setVisibility(View.GONE); activeTimeTI.setVisibility(View.GONE); } @Override public void onCancelled(@NonNull DatabaseError error) { Log.w("TAG", "读取历史活跃时长失败", error.toException()); } }); } });
你原有用于展示数据的监听逻辑不需要修改,本身即可正常读取累加后的总时长渲染到UI。
方案2:事务操作(正式场景推荐,避免并发冲突)
如果后续有多用户同时写入的需求,用Firebase自带的事务操作可以避免并发写入导致的计数错误,实现如下:
registerActivity.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String inputTimeStr = activeMinutes.getText().toString().trim(); if (inputTimeStr.isEmpty()) { return; } int newInputTime = Integer.parseInt(inputTimeStr); databaseReference.child("active time").runTransaction(new Transaction.Handler() { @NonNull @Override public Transaction.Result doTransaction(@NonNull MutableData mutableData) { int totalTime = newInputTime; String oldTimeStr = mutableData.getValue(String.class); if (oldTimeStr != null && !oldTimeStr.isEmpty()) { totalTime += Integer.parseInt(oldTimeStr); } mutableData.setValue(String.valueOf(totalTime)); return Transaction.success(mutableData); } @Override public void onComplete(@Nullable DatabaseError error, boolean committed, @Nullable DataSnapshot snapshot) { if (committed) { // 写入成功后执行原有UI逻辑 addActivity.setVisibility(View.VISIBLE); registerActivity.setVisibility(View.GONE); activeTimeTI.setVisibility(View.GONE); } else { Log.w("TAG", "时长写入失败", error != null ? error.toException() : null); } } }); } });
可选优化
你当前把时长存为String类型,每次读写都需要做类型转换,建议直接存为Integer数值类型,省去转换步骤的同时也能避免格式异常问题。
内容的提问来源于stack exchange,提问作者Caitlin
相关产品推荐
相关产品推荐

