我有一个简单的购物清单应用程序,由 firebase 支持/同步,并且由多个用户添加项目。我已经为“GroceryItem”和“Users”创建了数据结构。
我的应用程序的一个功能是,您可以单击单元格,它会在项目旁边放置一个复选标记,并将“已完成”布尔值更改为 true。
我正在尝试制作一个按钮,它将把所有选中标记的项目移动到一个名为“历史记录”的单独列表中。
以下是我多次失败的尝试之一。我还包括了 XCode 给我的错误:
“Element”(又名“AnyObject”)无法转换为“FDataSnapshot”;您的意思是使用“as!”吗?逼沮丧?
@IBAction func itemsBoughtACTION(sender: AnyObject) {
ref.queryOrderedByChild("completed").observeEventType(.Value,
withBlock: { snapshot in
for item in snapshot.children {
var lastItem = GroceryItem(item)
}
})
}
编辑:我只想对已经存储在 firebase 中的一些数据进行数据处理,将其移动到另一个 firebase 位置并删除原始数据。
其过程是:查询出想要的数据,写出到另一个节点,然后从原来的节点删除。
上面的代码将不起作用,因为它期望从 UI 而不是 FDataSnapshot 传递控件。如果您已经完成查询并拥有数据集,则应该创建一个函数,将 FDataSnapshot 作为参数传递并进行相应处理。
为了简化答案,假设您需要获取快照并在单击按钮时对其进行处理。
有很多不同的方法可以解决这个问题,这是一个概念性的选项(未经测试,所以不要复制粘贴)
//method is called when a button in the UI is clicked/tapped.
@IBAction func itemsBoughtACTION(sender: AnyObject) {
let rootRef = Firebase(url:"https://your-Firebase.firebaseio.com")
let groceryRef = rootRef.childByAppendingPath("groceryLists")
//get each child node of groceryRef where completed == true
groceryRef.queryOrderedByChild("completed").queryEqualToValue(true)
.observeEventType(.ChildAdded, withBlock: { snapshot in
//set up a history node and write the snapshot.value to it
// using the key as the node name and the value as the value.
let historyNode = rootRef.childByAppendingPath("history")
let thisHistoryNode = historyNode.childByAppendingPath(snapshot.key)
thisHistoryNode.setValue(snapshot.value) //write to the new node
//get a reference to the data we just read and remove it
let nodeToRemove = groceryRef.childByAppendingPath(snapshot.key)
nodeToRemove.removeValue();
})
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)