Swift 3 Firebase检索密钥并传递给视图控制器

时间:2017-09-05 12:38:01

标签: ios swift firebase

我花了好几个小时查看相同的问题,但我找到的答案都没有帮助解决这个问题。简单的应用程序从Firebase数据库中检索数据,并从tableview传递到另一个视图控制器。主数据将通过,但我无法编辑信息而没有标识“密钥”,我尝试将其设置为childByAutoID(),但随后更改为timestamp。无论方法如何,我得到的只是条目信息而不是实际密钥本身。

func loadData() {
    self.itemList.removeAll()
    let ref = FIRDatabase.database().reference()


    ref.child(userID!).child("MyStuff").observeSingleEvent(of: .value, with: { (snapshot) in



        if let todoDict = snapshot.value as? [String:AnyObject] {
            for (_,todoElement) in todoDict {



                let todo = TheItems()



                todo.itemName = todoElement["itemName"] as? String
                todo.itemExpires = todoElement["itemExpires"] as? String
                todo.itemType = todoElement["itemType"] as? String



                self.itemList.append(todo)

                print (snapshot.key);

            }



        }

        self.tableView.reloadData()

    }) { (error) in
        print(error.localizedDescription)
    }


}

2 个答案:

答案 0 :(得分:0)

您要查找的密钥位于for循环的迭代器

在if-let中,尝试这样做:

for (key,todoElement) in todoDict {
    print(key) // this is your childByAutoId key 
}

这应该可以解决问题。否则,请向我们显示数据库结构的屏幕

答案 1 :(得分:0)

如果您的数据如下所示:

var btn = document.querySelectorAll('#first> div> button');
var btn1 = document.querySelector('#first> div> button');

console.dir(btn)
console.dir(btn1)

然后我会这样查询:

Uid: {
    MyStuff: {
        AutoID: {
            itemName: “Apocalypse”,
            itemExpires: “December 21, 2012”,
            itemType: “Catastrophic”
        }
    }
}

此外,正如我在评论中所说,如果您使用的是ref.child(userID!).child("MyStuff").observeSingleEvent(of: .value, with: { (snapshot) in for child in snapshot.children { let child = child as? DataSnapshot let key = child?.key as? String if let todoElement = child?.value as? [String: Any] { let todo = TheItems() todo.itemName = todoElement["itemName"] as? String todo.itemExpires = todoElement["itemExpires"] as? String todo.itemType = todoElement["itemType"] as? String self.itemList.append(todo) self.tableView.reloadData() } } }) ,则可以上传包含数据的密钥。示例:

.updateChildValues()

然后你可以像获得其余值一样获得密钥。所以你的新数据看起来像这样:

let key = ref.child("userID!").childByAutoId().key
let feed = ["key": key,
         “itemName”: itemName] as [String: Any]

let post = ["\(key)" : feed]

ref.child("userID").child("MyStuff").updateChildValues(post) // might want a completionBlock