搜索firebase数据库以查找Sport而不是Gender

时间:2018-03-14 12:06:39

标签: java android firebase firebase-realtime-database

我正在开发一个类似于火种的应用程序,但是可以帮助用户找到玩特定运动的人。 我目前有代码在数据库中搜索用户的性别(用户可以匹配)。但是,数据库中的每个用户都有一个节点,其中包含用户可以选择的所有运动。如果用户更喜欢某项运动,则该值将保存为“true”,如果不是,则该值将保存为“false”。然后在应用程序上显示相应的用户。

数据库的屏幕截图如下所示:

https://i.stack.imgur.com/LdefD.png

这是我到目前为止的代码:

 public void checkUserSex(){
    final FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
    DatabaseReference userDb = usersDb.child(user.getUid());
    userDb.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            if (dataSnapshot.exists()){
                if (dataSnapshot.child("sex"). getValue() != null){
                    userSex = dataSnapshot.child("sex").getValue().toString();
                    switch (userSex){
                        case "Male":
                            oppositeUserSex = "Female";
                            break;
                        case "Female":
                            oppositeUserSex = "Male";
                            break;
                    }
                    getOppositeSexUsers();
                }
            }
        }
        @Override
        public void onCancelled(DatabaseError databaseError) {
        }
    });
}

public void getOppositeSexUsers(){
    usersDb.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
            if (dataSnapshot.child("sex").getValue() != null) {
                if (dataSnapshot.exists() && !dataSnapshot.child("connections").child("pass").hasChild(currentUId) && !dataSnapshot.child("connections").child("play").hasChild(currentUId) && dataSnapshot.child("sex").getValue().toString().equals(oppositeUserSex)) {
                    String profileImageUrl = "default";
                    if (!dataSnapshot.child("profileImageUrl").getValue().equals("default")) {
                        profileImageUrl = dataSnapshot.child("profileImageUrl").getValue().toString();
                    }
                    cards item = new cards(dataSnapshot.getKey(), dataSnapshot.child("name").getValue().toString(), profileImageUrl);
                    rowItems.add(item);
                    arrayAdapter.notifyDataSetChanged();
                }
            }
        }
        @Override
        public void onChildChanged(DataSnapshot dataSnapshot, String s) {
        }
        @Override
        public void onChildRemoved(DataSnapshot dataSnapshot) {
        }

        @Override
        public void onChildMoved(DataSnapshot dataSnapshot, String s) {
        }
        @Override
        public void onCancelled(DatabaseError databaseError) {
        }
    });
}

如何将其从匹配性别更改为匹配所选的运动?

1 个答案:

答案 0 :(得分:1)

不幸的是,Firebase Realtime数据库不允许基于多个属性的查询。要实现您想要的功能,您不需要完全重构数据库,只需稍微更改一下即可。要解决此问题,您需要为每项运动添加一个新节点。每次添加播放golf的新用户时,也请将其添加到相应的运动节点中。您的新节点应如下所示:

Firebase-root
    |
    --- golfPlayers
           |
           --- userId1 : true
           |
           --- userId2 : true

使用此结构,您可以查询数据库以仅获取正在播放golf的用户。这可以通过在golf节点上附加侦听器并迭代DataSnapshot对象来完成。

此练习称为denormalization,是Firebase的常见做法。为了更好地理解,我建议您观看此视频Denormalization is normal with the Firebase Database

注意,使用Cloud Firestore可以解决使用Firebase实时数据库无法解决的问题。试一试。