从Firebase检索多个子节点的数据

时间:2018-06-22 09:04:02

标签: java android firebase firebase-realtime-database

我正在开发一个应用程序,在该应用程序中,我只想显示其联系电话已保存在手机中的用户的数据。因此,我检索了一个联系电话列表contactList。现在,我想从Firebase获取所有contactList用户的帖子。有什么方法可以让Firebase仅询问contactList中的那些节点。一种方法是检索所有用户,然后从中获取相关用户(就像我在下面所做的那样)。有什么更好的方法吗?

Users: { 
            7828272892 : {
                 name: xyz, 
                 gender: male,
                 phoneNo: 7828272892
                 Posts: {
                     SomeKey1: {
                         content: "This is post 1", Var2: "kkk"} }},
            7924272894 : {name: abc, gender: male, phoneNo: 7924272894} 
        }

代码:

 databaseReference.child("Users").addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot snapshot) {
                List<Post> allItems = new ArrayList<Post>();
                for (DataSnapshot postSnapshot: snapshot.getChildren()) {
                 if (contactList.contains(postSnapshot.child("phoneNo").getValue())) {
                      // retrieve posts
                  }
                }
            }

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

            }
        });

2 个答案:

答案 0 :(得分:1)

  

有什么办法可以只向我的contactList中的那些节点询问Firebase吗?

是的,您已经执行此操作的方式。

  

还有更好的方法吗?

执行此操作的方法是Firebase中的常用做法。您查询数据库,并检查列表中是否已存在数据(在您的情况下,在contactList中)。如果列表包含该phoneNo,则可以检索这些帖子。

答案 1 :(得分:0)

尝试使用此代码读取多个节点数据。

 mFirebaseInstance = FirebaseDatabase.getInstance();
    mDatabase = mFirebaseInstance.getReference("usersDb/UserTable");
    mDatabase.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            mUserList.clear();
            for (DataSnapshot dataSnapshot1 : dataSnapshot.getChildren()) {
                User user = dataSnapshot1.getValue(User.class);
                mUserList.add(user); // add all data into list.
            }
            }


        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });