我正在使用新的firebase api来观察名为"帖子"
的实时数据库中的子路径这是一个JSON条目:
"posts" : {
"-KLT6oYF-F_5sf-dC_2R" : {
"items" : {
"item1" : {
"location" : "Post Street Mall",
"name" : "Glasses",
"price" : "199",
"vendor" : "Clicks"
}},
"tags" : "summer, casual, urban ",
"title" : "Casual Summer "
}
问题是每当我向"帖子"添加内容时触发了childAdded事件,我的app数据库更新了。遗憾的是,并未使用setValue()添加所有数据。
有没有办法只在所有项目添加时写入数据库?然后,当添加了一个帖子的所有数据时,将childAdded信号发送到应用程序?
非常感谢任何帮助。
基本示例代码如下:
// CREATING DATABASE OBSERVER TO SCAN POSTS
let postRef = database.child("posts")
// CONNECTING OBSERVER AND CHECKING FOR NEW ITEMS
postRef.observeEventType(.ChildAdded, withBlock: { (snapshot) -> Void in
// This is in a different class
postDBRef.child("title").setValue(self.mainImageTxt?.text) // I think this triggers the child added already? postDBRef.child("tags").setValue(self.tagsTxt?.text?.lowercaseString)
// getting cell data
for rowIndex in 0..<self.stepperValue {
let cell = self.tableView.cellForRowAtIndexPath(NSIndexPath(forRow: rowIndex, inSection: 0)) as! AddPostTableViewCell
let itemName = cell.itemNameTxt.text!
postDBRef.child("items/item\(rowIndex + 1)/name").setValue(itemName)
}
答案 0 :(得分:1)
你可以简单地使用updateChildValues
,保留你想要在数组中写的更改
let childUpdates = ["/posts/\(postKey)": postData,
"/posts/\(anotherPostId)": anotherPostData]
如果您要更新所有帖子,请致电
ref.updateChildValues(childUpdates)
这将写入一次数据,它将为您添加的每个孩子调用一个ChildAdded事件。
文档here。
答案 1 :(得分:1)
在代码中构建一个对象,说一个字典并一次写出来!这将消除必须进行迭代。然后你可以执行setValue(myObject),问题就会消失。
我发了一些快速代码来生成类似于你正在使用的数据结构。这将在代码中构建结构,然后使用一个setValue将其写出来。
假设您需要以下数据结构
items
item4
name: some item 3
item8
name: some item 7
以下是如何在代码中获取
let stepperValue = 10
var myDict = [String: [String: String] ]()
for rowIndex in 0..<stepperValue {
let itemName = "some item \(rowIndex)"
let childDict = ["name": itemName]
let parentKey = "item\(rowIndex + 1)"
myDict[parentKey] = childDict
}
let ref = myRootRef.childByAppendingPath("items")
ref.setValue(myDict)