无法获取我的 Firebase 数据库中的子项。

huangapple go评论76阅读模式
英文:

Can't get the Children in my firebase database

问题

[![Firebase数据库][1]][1]

  [1]: https://i.stack.imgur.com/o8k2v.jpg

我正在尝试获取节点“panadol”和“profinal”的这些值,但不起作用。
我已成功获取了日期。以下是我的代码示例:

    for (final String id: MedicinesListActivity.orderIdsList){

            // 获取订单日期
            DatabaseReference dateReference = FirebaseDatabase.getInstance()
                    .getReference("Orders").child(id);
            dateReference.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                    // 日期
                    String date = dataSnapshot.child("date").getValue(String.class);
                    Log.i("日期", date);

                    // 循环遍历特定订单ID中的所有产品
                    for (DataSnapshot s : dataSnapshot.child(MedicinesListActivity.userId).child("panadol").getChildren()){
                        Order order = s.getValue(Order.class);
                        Log.i("商品名称", "" + order.getName());
                    }

                }
            });
        }

MedicineListActivity.orderIds -> 包含我要循环遍历的所有订单ID
而类“Order”包含名称和订购数量。
但是它不起作用。
英文:

无法获取我的 Firebase 数据库中的子项。

I'm trying to get these values in the node panadol and profinal. but it's not working.
I was able to get the date successfully. Here's my code

for(final String id: MedicinesListActivity.orderIdsList){

        //get the date of the order
        DatabaseReference dateReference = FirebaseDatabase.getInstance()
                .getReference("Orders").child(id);
        dateReference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                //date
                String date = dataSnapshot.child("date").getValue(String.class);
                Log.i("Date", date);

                //loop through all the products in the specific order id
                for(DataSnapshot s : dataSnapshot.child(MedicinesListActivity.userId).child("panadol").getChildren()){
                    Order order = s.getValue(Order.class);
                    Log.i("Item_Name", ""+ order.getName());
                }

            }
        });
    }

MedicineListActivity.orderIds -> contains all the orderIds i want to loop through
and the class Order contains the name and the orderQuantity.
But it's not working.

答案1

得分: 1

为了解决这个问题,请使用以下代码行:

String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference uidRef = rootRef.child("Orders").child(id).child(uid);
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            String name = ds.child("name").getValue(String.class);
            String orderQuantity = ds.child("orderQuantity").getValue(String.class);
            Log.d("TAG", name + "/" + orderQuantity);
        }
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        Log.d("TAG", databaseError.getMessage()); //不要忽略错误!
    }
};
uidRef.addListenerForSingleValueEvent(valueEventListener);

在日志中的输出将会是:

panadol/3.0
profinal/2.0

或者使用 Order 类:

String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference uidRef = rootRef.child("Orders").child(id).child(uid);
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            Order order = ds.getValue(Order.class);
            Log.d("TAG", order.getName() + "/" + order.getOrderQuantity());
        }
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        Log.d("TAG", databaseError.getMessage()); //不要忽略错误!
    }
};
uidRef.addListenerForSingleValueEvent(valueEventListener);

结果将会是相同的。

在两种情况下,你必须使用所有节点名称在你的引用中,以便能够显示该数据。

英文:

To solve this, please use the following lines of code:

String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference uidRef = rootRef.child("Orders").child(id).child(uid);
ValueEventListener valueEventListener = new ValueEventListener() {
	@Override
	public void onDataChange(DataSnapshot dataSnapshot) {
		for(DataSnapshot ds : dataSnapshot.getChildren()) {
			String name = ds.child("name").getValue(String.class);
			String orderQuantity = ds.child("orderQuantity").getValue(String.class);
			Log.d("TAG", name + "/" + orderQuantity);
		}
	}

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

The output in the logcat will be:

panadol/3.0
profinal/2.0

Or using the Order class:

String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference uidRef = rootRef.child("Orders").child(id).child(uid);
ValueEventListener valueEventListener = new ValueEventListener() {
	@Override
	public void onDataChange(DataSnapshot dataSnapshot) {
		for(DataSnapshot ds : dataSnapshot.getChildren()) {
			Order order = ds.getValue(Order.class);
		    Log.d("TAG", ds.getName() + "/" + ds.getOrderQuantity);
		}
	}

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

The result will be the same.

In both cases, you have to use all node names in your reference to be able to display that data.

答案2

得分: 1

在每个用户节点下,似乎有一个命名产品列表(panadol、profinal)。您的代码在该列表中使用 dataSnapshot.child(MedicinesListActivity.userId).child("panadol") 查找一个名为 panadol 的命名产品:

// 遍历特定订单 ID 中的所有产品
for (DataSnapshot s : dataSnapshot.child(MedicinesListActivity.userId).child("panadol").getChildren()) {
    Order order = s.getValue(Order.class);
    Log.i("Item_Name", "" + order.getName());
}

由于您随后迭代了 panadol 的子节点,您的 s 快照指的是 panadol 的各个属性:nameorderQuantity。但您的代码似乎尝试将这些属性中的每一个映射到整个 Order 对象,这样做是行不通的。

您有两个选择:

  • 显示各个属性,而不使用 Order 类:

      for (DataSnapshot propSnapshot : dataSnapshot.child(MedicinesListActivity.userId).child("panadol").getChildren()) {
          Log.i("Item_Name", propSnapshot.getKey() + "=" + propSnapshot.getValue());
      }
    
  • 不使用循环,将产品及其属性获取到一个 Order 对象中:

      for (DataSnapshot propSnapshot : dataSnapshot.child(MedicinesListActivity.userId).getChildren()) {
          Order order = s.getValue(Order.class);
          Log.i("Item_Name", propSnapshot.getKey() + "=" + propSnapshot.getValue());
      }
    
英文:

It seems like under each user's node, you have a list of named products (panadol, profinal). Your code looks up one named product panadol in that list with dataSnapshot.child(MedicinesListActivity.userId).child("panadol"):

//loop through all the products in the specific order id
for(DataSnapshot s : dataSnapshot.child(MedicinesListActivity.userId).child("panadol").getChildren()){
    Order order = s.getValue(Order.class);
    Log.i("Item_Name", ""+ order.getName());
}

Since you then iterate over the child nodes of panadol, your s snapshot refers to the individual properties of panadol: name and orderQuantity. But your code seems to try to map each of those properties to an entire Order object, which won't work.

You have two options:

  • Show the individual properties, without using the Order class:

      for(DataSnapshot propSnapshot: dataSnapshot.child(MedicinesListActivity.userId).child("panadol").getChildren()){
          Log.i("Item_Name", propSnapshot.getKey() + "="+ propSnapshot.getValue());
      }
    
  • Don't use the loop, and get the products and their properties in an Order object:

      for(DataSnapshot propSnapshot: dataSnapshot.child(MedicinesListActivity.userId).getChildren()){
          Order order = s.getValue(Order.class);
          Log.i("Item_Name", propSnapshot.getKey() + "="+ propSnapshot.getValue());
      }
    

huangapple
  • 本文由 发表于 2020年4月10日 22:03:37
  • 转载请务必保留本文链接:https://go.coder-hub.com/61141940.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定