Firebase-将多个值原子写入多个位置 [英] Firebase - atomic write of multiple values to multiple locations
问题描述
我需要向Firebase注册一个对象.该对象具有多个字段,我需要将它们全部写入多个路径.
我的代码:
公共函数RegisterProductOnDatabase(数据库数据库:DatabaseReference){//一次交易RegisterProductOnDatabase(数据库:数据库)RegisterProductForAllUsers(数据库:数据库)}私有函数RegisterProductForAllUsers(数据库数据库:DatabaseReference){dataBase.child("Products").child(self.UniqueID()).child("Name").setValue(self.Name())dataBase.child("Products").child(self.UniqueID()).child("UniqueID").setValue(self.UniqueID())dataBase.child("Products").child(self.UniqueID()).child("Price").setValue(self.Price())dataBase.child("Products").child(self.UniqueID()).child("Description").setValue(self.Description())dataBase.child("Products").child(self.UniqueID()).child("ToBuy?").setValue(self.m_ToBuy)dataBase.child("Products").child(self.UniqueID()).child("ToSell?").setValue(self.m_ToSell)dataBase.child("Products").child(self.UniqueID()).child("Owner").setValue(self.m_Owner)dataBase.child("Products").child(self.UniqueID()).child("Amount").setValue(self.m_Amount)dataBase.child("Products").child(self.UniqueID()).child("MainImage").setValue(self.m_PicturesURLs.first)}私有函数RegisterProductForAddingUser(数据库数据库:DatabaseReference){dataBase.child("Users").child(m_Owner).child("Products").child(self.UniqueID()).child("Name").setValue(self.Name())dataBase.child("Users").child(m_Owner).child("Products").child(self.UniqueID()).child("UniqueID").setValue(self.UniqueID())dataBase.child("Users").child(m_Owner).child("Products").child(self.UniqueID()).child("Price").setValue(self.Price())dataBase.child("Users").child(m_Owner).child("Products").child(self.UniqueID()).child("Description").setValue(self.Description())dataBase.child("Users").child(m_Owner).child("Products").child(self.UniqueID()).child("ToBuy?").setValue(self.m_ToBuy)dataBase.child("Users").child(m_Owner).child("Products").child(self.UniqueID()).child("ToSell?").setValue(self.m_ToSell)dataBase.child("Users").child(m_Owner).child("Products").child(self.UniqueID()).child("Amount").setValue(self.m_Amount)dataBase.child("Users").child(m_Owner).child("Products").child(self.UniqueID()).child("MainImage").setValue(self.m_PicturesURLs.first)}
我需要功能"RegisterProductOnDatabase"作为一项事务运行-意味着所有写入的值都将作为一项事务写入.
1)如何使用Swift将所有这些数据作为一个事务写入?2)有没有一种更好的方法可以在不进行代码乘法的情况下写入所有这些值?
首先,您应该使用字典,而不要手动修改每个节点.
这来自Firebase文档:
let键= ref.child("posts").childByAutoId().keylet post = ["uid":userID,作者":用户名,标题":标题,身体":身体]让childUpdates = ["/posts/\(key)":发布,"/user-posts/\(userID)/\(key)/":发布]ref.updateChildValues(childUpdates)
在此处中了解更多有关写入数据的信息.
第二,为了在多个位置进行修改,请使用此答案,因为我最近有同样的问题./p>
I need to register an object to Firebase. The object has multiple fields, and I need to write them all to multiple paths.
My code :
public func RegisterProductOnDatabase(database dataBase: DatabaseReference)
{
// Run in one transaction
RegisterProductOnDatabase(database: dataBase)
RegisterProductForAllUsers(database: dataBase)
}
private func RegisterProductForAllUsers(database dataBase: DatabaseReference)
{
dataBase.child("Products").child(self.UniqueID()).child("Name").setValue(self.Name())
dataBase.child("Products").child(self.UniqueID()).child("UniqueID").setValue(self.UniqueID())
dataBase.child("Products").child(self.UniqueID()).child("Price").setValue(self.Price())
dataBase.child("Products").child(self.UniqueID()).child("Description").setValue(self.Description())
dataBase.child("Products").child(self.UniqueID()).child("ToBuy?").setValue(self.m_ToBuy)
dataBase.child("Products").child(self.UniqueID()).child("ToSell?").setValue(self.m_ToSell)
dataBase.child("Products").child(self.UniqueID()).child("Owner").setValue(self.m_Owner)
dataBase.child("Products").child(self.UniqueID()).child("Amount").setValue(self.m_Amount)
dataBase.child("Products").child(self.UniqueID()).child("MainImage").setValue(self.m_PicturesURLs.first)
}
private func RegisterProductForAddingUser(database dataBase: DatabaseReference)
{
dataBase.child("Users").child(m_Owner).child("Products").child(self.UniqueID()).child("Name").setValue(self.Name())
dataBase.child("Users").child(m_Owner).child("Products").child(self.UniqueID()).child("UniqueID").setValue(self.UniqueID())
dataBase.child("Users").child(m_Owner).child("Products").child(self.UniqueID()).child("Price").setValue(self.Price())
dataBase.child("Users").child(m_Owner).child("Products").child(self.UniqueID()).child("Description").setValue(self.Description())
dataBase.child("Users").child(m_Owner).child("Products").child(self.UniqueID()).child("ToBuy?").setValue(self.m_ToBuy)
dataBase.child("Users").child(m_Owner).child("Products").child(self.UniqueID()).child("ToSell?").setValue(self.m_ToSell)
dataBase.child("Users").child(m_Owner).child("Products").child(self.UniqueID()).child("Amount").setValue(self.m_Amount)
dataBase.child("Users").child(m_Owner).child("Products").child(self.UniqueID()).child("MainImage").setValue(self.m_PicturesURLs.first)
}
I need the function "RegisterProductOnDatabase" to run as one transaction - meaning all written values to be written as one transaction.
1) How can I write all this data as ONE transaction using Swift ? 2) Is there a better way to write all these values without code multiplication?
Firstly, you should use dictionaries instead of manually modifying each node.
This is from the Firebase documentation:
let key = ref.child("posts").childByAutoId().key
let post = ["uid": userID,
"author": username,
"title": title,
"body": body]
let childUpdates = ["/posts/\(key)": post,
"/user-posts/\(userID)/\(key)/": post]
ref.updateChildValues(childUpdates)
Read more about writing data here.
Secondly, in order to modify in multiple locations, use this answer as I have recently had the same question.
这篇关于Firebase-将多个值原子写入多个位置的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!