gpt4 book ai didi

java - firebase 检查子进程是否存在

转载 作者:行者123 更新时间:2023-12-02 03:36:46 26 4
gpt4 key购买 nike

所以我的后端使用 firebase。我的目标是将用户匹配添加到用户 ID。然而,当用户最初注册时,他们没有匹配的人。我想做的是检查“匹配”子项是否存在于用户子项中,如果不存在,则创建列表子项并存储第一个匹配项。但是,如果它已经存在,则只需添加匹配即可。这是我的代码:

    public void setMatch(final String match){
final Firebase ref = new Firebase("FIREBASEURL");
final Firebase userRef = ref.child("Flights").child(userName);
userRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
System.out.println("does the child exist? " + dataSnapshot.child("matches").exists());
if(!dataSnapshot.child("matches").exists()){
ArrayList<String> matches = new ArrayList<String>();
matches.add(match);
Firebase matchesRef = userRef.child("matches");
matchesRef.setValue(matches);
userRef.removeEventListener(this);
}else if(dataSnapshot.child("matches").exists()){
Map<String, Object> matches = new HashMap<>();
matches.put("matches", match);
userRef.child("matches").push().setValue(matches);
userRef.removeEventListener(this);
}
}

@Override
public void onCancelled(FirebaseError firebaseError) {

}
});
}

目前,该值被添加两次(如果该字段已存在,则调用 else if 两次/如果不存在,则调用 else if)。我不确定我做错了什么。

最佳答案

这听起来相当复杂。在 Firebase 数据库中,通常最好尽可能地将读取和写入操作分开。虽然推送 ID 是按时间顺序存储数据的好方法;如果项目有自然键,通常最好将它们存储在该键下。

例如,如果您的String match确实是String matchId,则可以使用matchId确保每个匹配项最多出现一次作为 key 。

userRef.child("matches").child(matchId).setValue(true);

此操作是幂等:无论您运行多少次,它都会给出相同的结果。

您会注意到,我没有检查已存在的匹配:Firebase 数据库会自动创建存储值所需的所有节点,并自动删除以下没有值的所有节点他们。

关于java - firebase 检查子进程是否存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37367913/

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