从Firebase数据库中的嵌套节点检索数据

时间:2018-04-29 18:19:36

标签: android firebase-realtime-database

这是我的数据库结构:

enter image description here

Request节点的所有子节点都是时间戳。对于特定时间戳,在产品节点内,我想要检索对象productName的所有值。然后安排它们,使其成为电子邮件的正文。我坚持的部分是获取productName的数据。

到目前为止,我已经能够获取第二个节点中的总数据。我正在使用的代码是:

    DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("Requests");
ref.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        collectProducts((Map<String, Object>) dataSnapshot.getValue());
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
});



private void collectProducts(Map<String, Object> value) {

    ArrayList<String> products = new ArrayList<>();
    for (Map.Entry<String, Object> entry : value.entrySet()){
        Map singleUser = (Map) entry.getValue();
        products.add((String) singleUser.get("total"));
    }

    Intent emailIntent = new Intent(Intent.ACTION_SEND);
    emailIntent.setType("plain/text");
    emailIntent.putExtra(Intent.EXTRA_EMAIL, "example@gmail.com");

    StringBuilder sb = new StringBuilder();
    for (String s : products) {
        sb.append(s);
        sb.append("\n");
    }
    emailIntent.putExtra(Intent.EXTRA_TEXT, sb.toString());

    try {
        startActivity(Intent.createChooser(emailIntent, "Send mail..."));
        Log.i("Email sent!", "");
    } catch (android.content.ActivityNotFoundException ex) {
        Toast.makeText(Cart.this,
                "There are no email clients installed.", Toast.LENGTH_SHORT).show();
    }

}

但是获得productName没有运气。

我是Android和Firebase的新手。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:0)

这样的事情可以解决问题:

DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("Requests");
ref.addListenerForSingleValueEvent(new ValueEventListener() {
  @Override
  public void onDataChange(DataSnapshot dataSnapshot) {
    for (DataSnapshot requestSnapshot: dataSnapshot.getChildren()) {
      DataSnapshot productsSnapshot = requestSnapshot.child("products");
      for (DataSnapshot productSnapshot: productsSnapshot.getChildren()) {
        System.out.println(productSnapshot.child("productName").getValue(String.class));
      }
    }
  }

  @Override
  public void onCancelled(DatabaseError databaseError) {
    throw databaseError.toException(); // don't ignore errors
  }
});

主要差异:

  • 当用户没有数据权限时,它会抛出一个明确的错误。
  • 它使用DataSnapshot.getChildren()循环播放儿童。
  • 它使用DataSnapshot.child()来处理特定的子快照。
  • 它使用DataSnapshot.getValue()来检索基元/字符串值。