Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.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
Swift 正在删除具有子值的父节点_Swift_Firebase_Firebase Realtime Database - Fatal编程技术网

Swift 正在删除具有子值的父节点

Swift 正在删除具有子值的父节点,swift,firebase,firebase-realtime-database,Swift,Firebase,Firebase Realtime Database,我正在努力克服我所面临的问题。如果找到正确的子值,我将尝试删除父节点/键 我通过一个特定的值来查询我的数据库,objectID,因为它将匹配通过参数传递的postID。将删除objectID值。然而,我正在努力移除它所属的密钥 到目前为止,我的结果好坏参半: 我可以使用以下代码删除objectID值: refSnap?.ref.child(“objectID”).child(postID).removeValue() 当然,我可以使用以下方法删除整个通知节点/目录: refSnap?.ref.

我正在努力克服我所面临的问题。如果找到正确的子值,我将尝试删除父节点/键

我通过一个特定的值来查询我的数据库,
objectID
,因为它将匹配通过参数传递的
postID
。将删除
objectID
值。然而,我正在努力移除它所属的密钥

到目前为止,我的结果好坏参半:

我可以使用以下代码删除
objectID
值:

refSnap?.ref.child(“objectID”).child(postID).removeValue()

当然,我可以使用以下方法删除整个
通知
节点/目录:

refSnap?.ref.child(“objectID”).queryEqual(toValue:posted).ref.removeValue()

refSnap?.key
提供
通知
节点下的所有键/节点


我无法访问存储有
objectID
和所有其他信息的密钥,因为它是
.childByAutoId
。有人能帮我把这个问题分类吗?

你的问题是你使用的是
childByAutoId
,你不能把这些随机的字母数字“绑定”到某个东西上(在本例中是post)

我要设置的结构如下:

-notifications

  --uid //notifications for user
      --- userAid+userBid //follow notification, if they unfollow you already now which one it is and you can go and delete it
      ---commentNotificationID // you give this notification the same Id that the comment has, so if the user deletes the comment you use that id to delete the notification as well.

虽然另一个答案提供了一些关于备用和可行结构的见解,但基于子节点删除节点的功能相当简单,可以在不更改结构的情况下直接解决问题

(请注意,结构可能需要更改,但在本练习中,我们将按原样使用。)

鉴于问题中建议的结构:

notification
   "rtupy..." //childByAutoId
      "-LFEMjAcny..." // childByAutoId
      "-LFEzrrq..."  // childByAutoId
          from: "aw,sdasdad"
          objectID: "-LFEMjAcn...."
          timestamp: 15292
          type: "comment"
假设您要删除节点“-LFEzrrq…”,如屏幕截图所示。该节点包含子对象ID:“-LFEMjAcn…”

要删除节点,需要查询包含所需objectID的节点,根据问题,该节点正在工作并返回正确的子节点

使用返回的快照获取其父密钥,并获取该节点的路径并将其删除。请注意,我们不知道OP用于获取要删除的节点的流程或代码-可能是来自另一个查询,节点引用被传入或通过其他方式传入的

let queryRef = //unknown how, but build the query for objectID = "-LFEMjAcny...."
queryRef.observeSingleEvent(of: .value, with: { snapshot in
    let key = snapshot.key //this is the parent key of the objectID node i.e. -LFEMzrrq..."
    let parentRef = snapshot.ref.parent! //this is the path to that parent
    let refToDelete = parentRef.child(key) //add the parent key to the path: -LFEzrrq
    refToDelete.removeValue() //delete it
})
如您所见,无论父节点的键有多深,此代码都将删除查询中找到的节点


密钥名称并不重要,因此使用.childByAutoId作为引用将节点连接在一起是安全的,通常是最佳做法,因为将节点密钥与其包含的数据断开关联会使您的结构具有高度可扩展性。

您能否提供更多关于它们在应用程序中代表的内容的上下文?e、 g第一个子项是用户ID,第二个子项(以LFE开始…)是notificationID,您所指的“键”是什么?看起来您正在将uid与
-
连接以启用查找/查询?我认为您可能没有可靠的数据库体系结构/模式。看看@Do2这个键
-LFEzrrqsgsoLeg7AGAj
就是我指的。外置钥匙。我有objectID,我运行了一个查询,其中它实际上等于通过参数传递的任何值。现在有了这些信息,我想移除/删除
-LFEzrrqsgsoLeg7AGAj
键/节点。有一个非常简单的解决方案,但您需要将您的Firebase结构作为文本包含在内,同时请将代码与您迄今为止尝试的内容一起包含在内。包含一行程序没有帮助,因为我们不知道什么是refSnap,也不知道它是如何填充的。请参阅,如果要查询包含objectID的节点,则必须知道要查询的路径,对吗?因此,查询将返回包含objectID的特定节点的快照,获取它的键,然后将其删除。i、 e.pathWeQueriedRef.child(键).removeValue。如果您可以使用执行查询的代码更新您的问题,我将发布一个带有代码的答案,以删除您要删除的节点。由连接组成的键只是另一种工作正常的通知类型。问题是展开的键/父级。如果满足条件(我的代码函数),我尝试将此节点/子节点作为一个整体删除。在我现在的代码中,
objectID
与通过参数传递的
postID
匹配。现在我只想删除key
-LFEzrrqsgsoLeg7AGAj
我明白了,当我说key时,我指的是
-LFEzrrqsgsoLeg7AGAj
。但您仍然没有回答我的问题,每个通知下的节点代表什么??显然,childByAutoID不适用于您,您需要选择不同的命名约定或将其全部删除,但如果我不知道每个孩子代表什么,我无法建议您。通知下的每个节点代表不同类型的通知。具有concetenation的节点是follow通知。如果一个人跟随另一个人,并且当他们决定取消跟随时,会生成该命令。逻辑运作完美无瑕。我正在尝试删除注释通知,因为这将尝试在调用此函数的表视图控制器中填充此信息,但您可以想象它会崩溃,希望这能回答您的问题。我已接受您的答案。谢谢你帮助我。为我是个白痴道歉。非常感谢你。我真的很感激。祝您有一个愉快的一天善良的先生。很高兴,仅供将来参考。您提供的信息越多,您就越容易和更快地让他人帮助您……阅读作者的问题及其对我答案的评论,并告诉我如何构建
queryRef
?“如果您要查询包含objectID的节点,那么您必须知道要查询的路径,对吗?”您假设作者没有犯错误,请查看代码和数据库,告诉我如何获取路径…@Do2我同意