Firebase Realtime Database更新total字段异常:自动变回1求助
问题原因及解决方案
核心问题点
- 错误初始化Product对象:你创建了空的
Product product = new Product();,该对象的total默认值为0,后续计算始终基于0+1得到1,而非数据库中存储的实际值。 - 未读取数据库中的真实Product数据:遍历
DataSnapshot时,没有将数据库对应节点的Product数据赋值给创建的product对象,导致rate相关取值都是默认0。 - 使用持续型监听器:
addValueEventListener会持续监听数据变化,更新数据库后监听器会再次触发,重复执行更新逻辑,引发数据异常回滚。
修正后的代码
reference = FirebaseDatabase.getInstance().getReference(uuid).child("product"); giverating.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 使用单次监听器,仅读取一次数据 reference.addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { int rate = 0; int total = 0; String stringrate = ""; for (DataSnapshot postSnapshot : snapshot.getChildren()) { Product product = postSnapshot.getValue(Product.class); if (product != null && product.getId().equals(uid)) { // 从数据库的Product对象中获取当前真实值 total = product.getTotal(); switch (finalrate) { case 5: rate = product.getFive(); stringrate = "five"; break; case 4: rate = product.getFour(); stringrate = "four"; break; case 3: rate = product.getThree(); stringrate = "three"; break; case 2: rate = product.getTwo(); stringrate = "two"; break; case 1: rate = product.getOne(); stringrate = "one"; break; } rate += 1; total += 1; // 更新数据库字段 reference.child(uid).child(stringrate).setValue(rate); reference.child(uid).child("total").setValue(total); Toast.makeText(ProductDetails.this, "Your rating has been taken", Toast.LENGTH_SHORT).show(); // 找到目标节点后退出循环,避免冗余遍历 break; } } } @Override public void onCancelled(@NonNull DatabaseError error) { Toast.makeText(ProductDetails.this, "Failed to update rating", Toast.LENGTH_SHORT).show(); } }); } });
关键修正说明
- 替换监听器类型:用
addListenerForSingleValueEvent替代addValueEventListener,确保仅读取一次数据,避免更新后重复触发逻辑。 - 正确获取数据库数据:循环中直接将
postSnapshot.getValue(Product.class)赋值给product对象,拿到数据库存储的真实字段值。 - 简化分支逻辑:用switch替换冗余的if-else分支,提升代码可读性。
- 添加空值判断:避免product为空时触发空指针异常。
- 提前退出循环:找到目标节点后立即退出循环,优化性能。
内容的提问来源于stack exchange,提问作者fairooz ahmed
相关产品推荐
相关产品推荐

