Firebase - 将多个值原子写入多个位置

时间:2018-02-17 09:18:42

标签: ios swift xcode firebase

我需要向Firebase注册一个对象。该对象有多个字段,我需要将它们全部写入多个路径。

我的代码:

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)
}

我需要将函数“RegisterProductOnDatabase”作为一个事务运行 - 这意味着所有写入的值都要写为一个事务。

1)如何使用Swift将所有这些数据写为ONE事务? 2)有没有更好的方法来编写所有这些值而无需代码乘法?

1 个答案:

答案 0 :(得分:1)

首先,您应该使用词典而不是手动修改每个节点。

这来自Firebase文档:

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)

详细了解如何撰写数据here

其次,为了在多个地点进行修改,请使用this回答,因为我最近遇到了同样的问题。