如何在不下载孩子的情况下从Firebase获取儿童钥匙?

时间:2018-05-01 13:15:59

标签: java android firebase firebase-realtime-database

我有一个Firebase数据库,其节点“items”有很多子项,我想导入子键列表。由于每个孩子都包含一些我对此目的不感兴趣的数据,我只想下载子键(以最小化传输的数据量)。为了说明,假设我有以下数据结构:

enter image description here

然后我想得到所有用户的id,所以5Aoz6ZaB9QS7o9M4lsdbh07VGA02等等。但是没有下载其他用户数据,如消息,名称,建议和得分。

2 个答案:

答案 0 :(得分:3)

要获取这些用户的ID,请使用以下代码:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference usersRef = rootRef.child("users");
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            String uid = ds.getKey();
            Log.d("TAG", uid);
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {}
};
usersRef.addListenerForSingleValueEvent(valueEventListener);

输出将是:

5Aoz6ZaB9QS7o9M4lsdbh07VGA02
// the other ids

在特定节点上附加侦听器时,您将获得该节点下的所有数据。这就是Firebase实时数据库的工作原理,不幸的是这种行为无法改变。但是有一种解决方法,您可以在其中创建另一个单独的节点,您可以在其中单独添加所有这些ID。新节点应如下所示:

Firebase-root
   |
   --- userIds
          |
          --- 5Aoz6ZaB9QS7o9M4lsdbh07VGA02: true
          |
          --- //other ids

在这种情况下,如果您在userIds节点上附加一个侦听器,您将只获得所需的数据,仅此而已。获取这些ID的代码与上面的代码相似,但不是使用.child("users"),而是需要使用.child("userIds")。输出将是相同的。

如果您想要其他行为,可以考虑使用Cloud Firestore,此行为不再是问题。

答案 1 :(得分:1)

您可以使用 shallow=true 参数。它将只返回第一层结果(键),跟随 true

/users.json?shallow=true 的请求 将返回以下内容:

{
  5Aoz6ZaB9QS7o9M4lsdbh07VGA02: true,
  900xwQqVBMOOBUBFbQTeyjwhFsc2: true,
  RqwVZgV5cWd1fwkWm2ibuSX0Zfe2: true,
  bnDyoXg2sXPJoSAuvdHjkFBLdao2: true,
  fitCihcRwYQOpza7nsdawCHJ6Bn1: true,
}

查看更多信息:https://firebase.google.com/docs/database/rest/retrieve-data