Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/193.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在firebase数据库中搜索运动而不是性别_Java_Android_Firebase_Firebase Realtime Database - Fatal编程技术网

Java 在firebase数据库中搜索运动而不是性别

Java 在firebase数据库中搜索运动而不是性别,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我正在开发一个类似tinder的应用程序,但它可以帮助用户找到可以玩特定运动的人。 我目前有代码在数据库中搜索用户的性别(用户可以匹配)。但是,数据库中的每个用户都有一个节点,其中包含用户可以选择的所有运动。如果用户喜欢某项运动,则该值保存为“真”,如果不喜欢,则该值保存为“假”。相应的用户将显示在应用程序上 数据库的屏幕截图如下所示: 这是我目前掌握的代码: public void checkUserSex(){ final FirebaseUser user = Firebase

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

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

这是我目前掌握的代码:

 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) {
        }
    });
}

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

不幸的是,Firebase实时数据库不允许基于多个属性的查询。要实现您想要的,您不需要完全重构数据库,只需要对其进行一点更改。要解决此问题,需要为每个运动添加一个新节点。每次添加玩
高尔夫的新用户时,也要将其添加到相应的运动节点中。您的新节点应如下所示:

Firebase-root
    |
    --- golfPlayers
           |
           --- userId1 : true
           |
           --- userId2 : true
使用此结构,您可以查询数据库,仅获取正在玩
高尔夫的用户。这可以通过在
golf
节点上附加一个侦听器并迭代
DataSnapshot
对象来实现

这种做法被称为
非规范化
,是Firebase的常见做法。为了更好地理解,我建议您观看此视频


请注意,您尝试执行的操作无法使用Firebase实时数据库解决,可以使用解决。试试看。

这是非规范化的一部分,因为它是复制数据,具体称为索引。顺便说一句,你的Firestore建议太好了。@cutiko谢谢!非常感谢您的建议,我设法对其进行了编辑,使数据库按建议显示。关于如何使用firestore来匹配其他内容,有什么建议吗?这只是阅读firestore的一个提示。这意味着更改项目的数据库。目前,请继续使用Firebase实时数据库。很高兴听到您成功地编辑了所有内容,使数据库按建议显示。如果你认为我的答案帮助了你,请考虑通过点击投票箭头左侧的勾选来接受我的答案。应该把颜色改成绿色。谢谢当前数据结构的问题在于,需要为每个
Sport
值定义一个索引,这通常是不可行的。这就是为什么最好创建自己的反向查找结构,正如Alex的回答所示。关于另一个解释,请看我的回答: