当直接父级已知时,如何在firebase中获取子键值对?

bjp0bcyl  于 2021-06-29  发布在  Java
关注(0)|答案(2)|浏览(328)

我已经编写了以下代码来搜索特定的节点,它确实可以正常工作。

private void SearchFirebase() {
    Rootref.orderByChild("IMG").equalTo(imUrl).addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot snapshot) {
            for (DataSnapshot product : snapshot.getChildren()){
                id = product.getKey(); //returns the id(for eg. 8006)
            }
        }

        @Override
        public void onCancelled(@NonNull DatabaseError error) {

        }
    });
}

但是我不知道在知道特定的父键之后如何访问子键-值对

在上面的图片中,我需要获取键值对,如产品名称或产品折扣等。

jslywgbw

jslywgbw1#

查询firebase实时数据库时,获取数据最方便的方法是直接从“datasnapshot”对象调用正确的子对象,并将其转换为正确的类型,如下几行代码所述:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference productsRef = rootRef.child("Products");
Query imgUrlQuery = productsRef.orderByChild("IMG").equalTo(imUrl);
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            String productDiscount = ds.child("Product Discount").getValue(String.class);
            String productId = ds.child("Product Id").getValue(String.class);
            String productName = ds.child("Product Name").getValue(String.class);
            String productPrice = ds.child("Product Price").getValue(String.class);
            String shopName = ds.child("Shop Name").getValue(String.class);
            Log.d("TAG", productDiscount + "/" + productId + "/" + productName + "/" + productPrice + "/" + shopName);
        }
    }

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

logcat中的结果将是:

0/8006/Frooti/50/shop-A
3ks5zfa0

3ks5zfa02#

您只需将child添加到您的引用中,并按照此答案中的说明获取数据

private void SearchFirebase() {
    Rootref.orderByChild("IMG").equalTo(imUrl).addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot snapshot) {
            for (DataSnapshot product : snapshot.getChildren()){
                id = product.getKey();
                Log.i(TAG, Rootref.child(id).child("Product Discount").getValue(String.class));
            }
        }

        @Override
        public void onCancelled(@NonNull DatabaseError error) {

        }
    });
}

相关问题