我有一个Firebase数据库,其节点“items”有很多子项,我想导入子键列表。由于每个孩子都包含一些我对此目的不感兴趣的数据,我只想下载子键(以最小化传输的数据量)。为了说明,假设我有以下数据结构:
然后我想得到所有用户的id,所以5Aoz6ZaB9QS7o9M4lsdbh07VGA02
等等。但是没有下载其他用户数据,如消息,名称,建议和得分。
答案 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