0

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?

Ofri
  • 289
  • 5
  • 17

1 Answers1

2

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.

Toma Radu-Petrescu
  • 2,152
  • 2
  • 23
  • 57
  • I'm having some trouble understanding this. In my case, this code should be : let key = ref.child("Products").child(Product.UniqueID).key let prod = [ // all fields here] let childUpdates = ["/Products/\(key)" : prod, "users/(UserID)/\(key)/": prod] ref.updateCHildValues(childUpdates) – Ofri Feb 17 '18 at 10:11
  • So this works for UPDATING, is it the same for WRITING ? – Ofri Feb 17 '18 at 10:15
  • 1
    Update works the same as writing. If the node isn't there, it will create it. Please read the first link I referenced. – Toma Radu-Petrescu Feb 17 '18 at 10:23