Swift 正在更新Firebase中的子节点。为什么只更新一个引用而不同时更新两个引用?
我的firebase数据库中有用户Swift 正在更新Firebase中的子节点。为什么只更新一个引用而不同时更新两个引用?,swift,firebase,firebase-realtime-database,Swift,Firebase,Firebase Realtime Database,我的firebase数据库中有用户 Ref.child("users").child(currentUserUid!).child("Friends").updateChildValues([userClickedOnId! : false]) Ref.child("users").child(currentUserUid!).child("Friends").updateChildValues([userClickedOnId! : false]) 我正在尝试添加好友请求功能。当按下
Ref.child("users").child(currentUserUid!).child("Friends").updateChildValues([userClickedOnId! : false])
Ref.child("users").child(currentUserUid!).child("Friends").updateChildValues([userClickedOnId! : false])
我正在尝试添加好友请求功能。当按下好友请求按钮时,我希望数据库中两个用户的好友列表都能相应地修改
Ref.child("users").child(currentUserUid!).child("Friends").updateChildValues([userClickedOnId! : false])
出于某种原因
Ref.child("users").child(currentUserUid!).child("Friends").updateChildValues([userClickedOnId! : false])
准确更新当前用户的好友列表。但是第一句话,
Ref.child("users").child(currentUserUid!).child("Friends").updateChildValues([userClickedOnId! : false])
Ref.child("users").child(userClickedOnId!).child("Friends").updateChildValues([currentUserUid : false])
不更新firebase数据库中已单击用户的好友列表
Ref.child("users").child(currentUserUid!).child("Friends").updateChildValues([userClickedOnId! : false])
我添加了打印语句,一次尝试一个语句。以Ref.开头的语句几乎相同,那么为什么只有第二条语句可以修改当前用户的好友列表
Ref.child("users").child(currentUserUid!).child("Friends").updateChildValues([userClickedOnId! : false])
@IBAction func funcconnectRequestButtonDidTapped(_ sender: Any) {
let currentUserUid = Auth.auth().currentUser?.uid
let userClickedOnId = uid
let Ref = Database.database().reference()
Ref.child("users").child(userClickedOnId!).child("Friends").updateChildValues([currentUserUid : false])
Ref.child("users").child(currentUserUid!).child("Friends").updateChildValues([userClickedOnId! : false])
}
您可以创建另一个节点friendRequests,在该节点中,您可能有键为userUIDs和data
senderUID1:datelong、senderUID2:datelong
的child,只需在应用程序dbref.child('friendRequests/')+userUID)中侦听即可.addChildEventListener,您将获得所有已存在的好友请求并侦听新请求。让具有parentID的用户能够将senderuid的值写入true或“accepted”,这非常适合您。
然后创建一个云函数(触发器)来监听
friendRequests/{userUID}/{senderUID}
上的更新,如果该值为true,则添加到两个friend列表中,列出每个用户的ID。如果为false,请删除此引用。由于根据您的数据结构编写所有这些代码将花费大量时间,因此我将为您提供已经存在的代码,但您必须重写它: 规则如下:
Ref.child("users").child(currentUserUid!).child("Friends").updateChildValues([userClickedOnId! : false])
"friendList": {
"$uid":{
".read" : "$uid === auth.uid",
"$friendUID": {
".write": "$uid === auth.uid && data.exists() && newData.val() == false"
}
}
},
"friendRequest": {
"$uid": {
".read" : "$uid === auth.uid",
"$senderUID": {
".write" : "$senderUID === auth.uid && $senderUID != $uid && !data.exists() && root.child('userInfo').child($uid).exists() && !root.child('blockList').child($uid).child($senderUID).exists() && !root.child('blockList').child($senderUID).child($uid).exists() && !root.child('friendList').child($uid).child($senderUID).exists() && !root.child('friendList').child($senderUID).child($uid).exists() && !root.child('friendRequest').child($senderUID).child($uid).exists()",
".validate": "newData.hasChildren(['message', 'date'])",
"message": {
".validate": "newData.isString() && newData.val().length < 51 && newData.val().length > 0"
},
"date": {
".validate": "newData.val() == now" // ServerValue.TIMESTAMP
},
"accepted": {
".write" : "$uid === auth.uid && $uid != $senderUID && (newData.val() == true || newData.val() == false) && !data.exists() && root.child('friendRequest').child($uid).child($senderUID).exists()"
},
"$other": {
".validate": false
}
}
}
},
"blockList":{
"$uid":{
".read": "$uid === auth.uid",
"$blockUID": {
".write" : "$uid === auth.uid && $uid != $blockUID && ( ((!data.exists() && newData.val() == true) || (data.exists() && !newData.exists())) ) && root.child('userInfo').child($blockUID).exists()"
}
}
},
你可以移除阻塞并做你自己的事情。这是100%有效的,因为我已经在这个应用程序中对它进行了测试:您可以创建另一个节点friendRequests,在这个节点中,您可能有密钥为userUIDs和data的child
senderUID1:datelong,senderUID2:datelong
,只需在您的应用程序dbref.child('friendRequests/'+userUID)中侦听即可.addChildEventListener,您将获得所有已存在的好友请求并侦听新请求。Ref.child("users").child(currentUserUid!).child("Friends").updateChildValues([userClickedOnId! : false])
让具有parentID的用户能够将senderuid的值写入true或“accepted”,这非常适合您。然后创建一个云函数(触发器)来监听
friendRequests/{userUID}/{senderUID}
上的更新,如果该值为true,则添加到两个friend列表中,列出每个用户的ID。如果为false,请删除此引用。由于根据您的数据结构编写所有这些代码将花费大量时间,因此我将为您提供已经存在的代码,但您必须重写它: 规则如下:
Ref.child("users").child(currentUserUid!).child("Friends").updateChildValues([userClickedOnId! : false])
"friendList": {
"$uid":{
".read" : "$uid === auth.uid",
"$friendUID": {
".write": "$uid === auth.uid && data.exists() && newData.val() == false"
}
}
},
"friendRequest": {
"$uid": {
".read" : "$uid === auth.uid",
"$senderUID": {
".write" : "$senderUID === auth.uid && $senderUID != $uid && !data.exists() && root.child('userInfo').child($uid).exists() && !root.child('blockList').child($uid).child($senderUID).exists() && !root.child('blockList').child($senderUID).child($uid).exists() && !root.child('friendList').child($uid).child($senderUID).exists() && !root.child('friendList').child($senderUID).child($uid).exists() && !root.child('friendRequest').child($senderUID).child($uid).exists()",
".validate": "newData.hasChildren(['message', 'date'])",
"message": {
".validate": "newData.isString() && newData.val().length < 51 && newData.val().length > 0"
},
"date": {
".validate": "newData.val() == now" // ServerValue.TIMESTAMP
},
"accepted": {
".write" : "$uid === auth.uid && $uid != $senderUID && (newData.val() == true || newData.val() == false) && !data.exists() && root.child('friendRequest').child($uid).child($senderUID).exists()"
},
"$other": {
".validate": false
}
}
}
},
"blockList":{
"$uid":{
".read": "$uid === auth.uid",
"$blockUID": {
".write" : "$uid === auth.uid && $uid != $blockUID && ( ((!data.exists() && newData.val() == true) || (data.exists() && !newData.exists())) ) && root.child('userInfo').child($blockUID).exists()"
}
}
},
你可以移除阻塞并做你自己的事情。这是100%有效的,因为我已经在这个应用程序中进行了测试:首先想到的是安全规则。您是否有允许用户只写入自己数据的安全规则?如果是,,您还应该在客户端日志中找到写入操作不起作用的错误消息。我的读和写安全设置都设置为true@LynnO“Brian只需在朋友请求时创建一个单独的节点挂起请求,并在接受该请求时将该节点添加到朋友列表中。”首先想到的是安全规则。您是否有允许用户只写入自己数据的安全规则?如果是,,您还应该在客户端日志中找到写入操作不起作用的错误消息。我的读和写安全设置都设置为true@LynnO“Brian只需在朋友请求时创建一个单独的节点挂起请求,并在接受该请求时将该节点添加到朋友列表中。”感谢您提供的帮助反馈我想我能够解决我的问题。感谢您的宝贵反馈!我想我能解决我的问题。
Ref.child("users").child(currentUserUid!).child("Friends").updateChildValues([userClickedOnId! : false])