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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 08:15:44