首页 > 解决方案 > 在 Firebase 中检索和更新子数据

问题描述

我在从 Firebase 实时数据库中检索和更新值时遇到问题:

reff = FirebaseDatabase.getInstance().getReference("Items").child(a);
        reff.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                for (DataSnapshot snap : dataSnapshot.getChildren()) {
                    Items items = dataSnapshot.getValue(Items.class);
                    Integer na = items.getItemQuantity();

                    if (na <= 0) {
                        Toast.makeText(CheckOut.this, "Out of Stock", Toast.LENGTH_LONG).show();
                    } else {
                        na--;
                        snap.child("itemQuantity").getRef().setValue(na);
                    }
                }
            }
            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });

来自 if-else 的第 60 行错误日志。

标签: javaandroidfirebasefirebase-realtime-database

解决方案


根据您的最后评论:

是的,a 是我将从条形码收到的条形码。单个孩子的 itemQuantity。

要获取itemQuantity单个孩子的属性值,请使用以下代码行:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference barcodeRef = rootRef.child("Items").child("1234567781");
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        long itemQuantity = dataSnapshot.child("itemQuantity").getValue(Long.class);
        Log.d(TAG, String.valueOf(itemQuantity));

        //Do what you need to do with itemQuantity
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        Log.d(TAG, databaseError.getMessage()); //Don't ignore errors!
    }
};
barcodeRef.addListenerForSingleValueEvent(valueEventListener);

logcat 中的结果将是:

14

您的代码中的问题是您在实际上不需要时dataSnapshot使用方法循环对象。getChildren()您应该只获得上述代码中的正确引用,并itemQuantity根据需要简单地使用属性的值。


推荐阅读