gpt4 book ai didi

java - 在 firebase 数据库中搜索 Sport 而不是 Gender

转载 作者:行者123 更新时间:2023-12-02 11:31:24 26 4
gpt4 key购买 nike

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

数据库截图如下:

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

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

最佳答案

遗憾的是,Firebase 实时数据库不允许基于多个属性的查询。为了实现你想要的,你不需要完全重组你的数据库,你只需要稍微改变它。为了解决这个问题,你需要为每项运动添加一个新节点。每次添加玩高尔夫的新用户时,也将其添加到其相应的运动节点中。您的新节点应如下所示:

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

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

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

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

关于java - 在 firebase 数据库中搜索 Sport 而不是 Gender,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49277399/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com