在swift中仅使用来自firebase的值返回一个键

Posted

技术标签:

【中文标题】在swift中仅使用来自firebase的值返回一个键【英文标题】:return a key using only a value from firebase in swift 【发布时间】:2018-08-17 11:43:32 【问题描述】:

我正在尝试在 Firebase 中仅使用值来检索密钥。

我在 Swift 中为 ios 工作

尝试编写一个想要返回“hey”的函数,当仅给定用户电子邮件地址“hey@hey.com”时

基本上有手头的价值,并想检索密钥,我试图删除该条目。

有人有什么建议吗?

这是我不确定的一点。

override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) 
    if (editingStyle == UITableViewCellEditingStyle.delete) 

        let friendsSelectedEmail = friendsEmailsFromFirebase[indexPath.row]
        let refToUserFriendList = fir.child("mybuddies").child(userID)
        print(friendsSelectedEmail)

        //query for the key of the email address, then use that to delete the object
        //Or is there an easier firebase method?



        self.tableView.reloadData()

    

**编辑

简而言之,我只想删除这个键值对,并且我只能访问值(电子邮件地址),这可以通过单个 firebase 方法实现吗? **假设我不使用@jay 发布的更好的结构。

【问题讨论】:

你能显示minimal code that reproduces where you are stuck吗?这将真正帮助我们具体了解问题所在。 当然!也谢谢! 你认为的其实并不是关键。键是zCUnxxxxxxxxxxxxxxxxTx2,其余部分是值。所以你的方法是错误的。 使用当前的数据库结构,您必须使用单个观察者一次获取所有电子邮件节点,并且需要在本地根据电子邮件过滤密钥。 fir.child("mybuddies").child(userID) 是否指向屏幕截图中的 zCUnK... 节点? 【参考方案1】:

看来这里的意图是使用 hey@hey.comhey 部分作为键。

更好的方法是使用 childByAutoId 创建子节点并将属性存储在该节点中。所以你的结构变成了

zCu.....
  email: "hey@hey.com"
  buddy_name: "Leroy"
  domain: "hey.com"

然后您可以简单地在所有节点中查询等于“hey@hey.com”的电子邮件,这将返回一个快照,其中还包含用户名(嘿)和域(如果需要,嘿.com)

如果您需要该查询的代码,请告诉我。请记住,Firebase 是异步的,因此它不会真正“返回”值。您在查询之后使用闭包中的值。

从评论中,我们似乎想删除 buddy_name 和 email 但离开节点。如果节点是已知的,您可以创建该引用,否则您可以查询它。无论哪种方式,您都将获得节点的父键

let buddyRef = parent_node_key.child("buddy_name")
let domainRef = parent_node_key.child("domain")

buddyRef.setValue("")
domainRef.setValue("")

请记住,我在这种情况下留下了电子邮件,就好像我们删除了它一样,那么整个节点都会消失;一个节点必须至少有一个值才能存在。

增加一些清晰度;

要创建该结构,您需要知道用作密钥的用户 uid,或者如果您希望在另一个节点中使用它,请使用 .childByAutoId 来创建密钥。

let ref = thisUsersUid  //or let ref = your_firebase.childByAutoId()
ref.child("email").setValue("hey@hey.com")
ref.child("domain").setValue("hey.com")
ref.child("buddy_name").setValue("Leroy")

【讨论】:

“嘿”其实是好友的名字。与电子邮件地址没有任何共同关系。用户从表格视图中选择好友的电子邮件地址并希望将其删除。假设用户想要删除 hey away(也是整个键值对),只给定电子邮件地址。我想知道是否有允许这样做的 firebase 方法。 我更新了结构以反映 buddy_name。在这种情况下,它是 Leroy。向您的节点查询电子邮件地址 hey@hey.com 并删除返回的节点。 没错!将好友名称键更改为“电子邮件”,并添加另一个以“好友名称”为键、其名称为值的子节点。然后您可以使用我的答案中的代码轻松删除这些节点。 您没有使用它作为密钥。您的键是“电子邮件”和“好友名称”,值将是电子邮件地址和好友名称。具体例子看我的回答 如果有帮助,别忘了接受答案。接受为您提供指导并帮助解决问题的答案也可以帮助其他有类似问题的人。

以上是关于在swift中仅使用来自firebase的值返回一个键的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 swift 和 firebase 正确使用完成处理程序?

函数没有返回,Swift Firebase

Swift不检索Firebase值(返回值为NSNull)

想要使用 Swift 3.0 发送自定义电子邮件,即来自 firebase 的欢迎邮件

无法在 Swift 中使用来自 Firebase 的数据立即加载 UIImageView 和 UILabel

如何使用 swift 读取 Firebase 数据库中的值,然后在地图上进行注释?