Как реализовать транзакцию Firebase - PullRequest
2 голосов
/ 02 июня 2019

У меня есть эта схема в моей базе данных: enter image description here

У меня есть узел, под которым у статей есть идентификаторы пользователей, под одним идентификатором у меня есть имя списка желаний, затем статьии информация о списке желаний, поэтому, когда я хочу изменить имя списка желаний, я беру потомков узла, который хочу изменить, затем я создаю w нового с новым именем и теми же потомками, а затем удаляю старый список желаний.Поэтому я хочу создать транзакцию, чтобы выполнить всю работу одновременно или вообще не выполнять ее, если имеется плохое соединение, потому что я могу потерять данные, если операция прервана.Это мой текущий код и как я могу поместить операцию в транзакцию Firebase.Спасибо за помощь !

func updateWishlist(wishlist:WishList,newName:String){
    if((reachability.connection == .wifi) || (reachability.connection == .cellular)){
        self.showProgressView()
        let child = self.ref.child("Articles").child((user!.uid)!)
        self.ref.child("Articles").child((user!.uid)!).child(wishlist.name) .updateChildValues(["name":newName]) { error, _ in
            if(error == nil){
                //create new node with new name
                let oldName=wishlist.name
                child.child(wishlist.name).observeSingleEvent(of: .value, with: { (snapshot) in self.ref.child("Articles").child((GlobalVar.user!.uid)!).child(newName).setValue(snapshot.value as! [String : Any]) { error, _ in
                        if(error == nil){
                            self.dismissHUD(isAnimated: true)
                            self.title=newName
                            self.showMessage("Wishlist modifier !", type: .success, options: [.position(.bottom)])
                        self.ref.child("Articles").child((GlobalVar.user!.uid)!).child(oldName).removeValue()

                        }
                        else{
                            self.dismissHUD(isAnimated: true)

                            print("update wishlist name transaction failed")
                        }
                    }
                    user?.wishLists[self.passedWishlistIndex!].name=newName
                })
            }
            self.dismissHUD(isAnimated: true)
        }
    }
}

1 Ответ

1 голос
/ 02 июня 2019

Эта проблема действительно сводится к этому утверждению

Я хочу изменить имя списка желаний. Я беру детей (из) узла I хочу потом поменять создать новый с новым именем и таким же потом дети удаляю старый список желаний

Исправлено: не использовать динамические данные в качестве ключей узла . Реструктуризация ваших данных исключит необходимость транзакции.

Имя списка желаний должно быть сохранено как дочерний элемент узла с ключом, созданным с помощью .childByAutoId .

Чтобы уточнить, ваша структура в настоящее время это

Articles
   article_0
      dadoune //wish list name
      solo    //with list name
         articles
            xxx
            yyy
            zzz
   artical_1
   artical_2

и вот что будет работать; переместить имя списка желаний в дочерний узел.

Articles
   article_0
      -Jk0ksk0kj9sdfsdf   //wish list key created with .childByAutoId
         wish_list_name: "dadoune"  //store the name as a child
      -Jyl909m9mm3o99jt   //wish list key created with .childByAutoId
         wish_list_name: "solo"  //store the name as a child
         articles
            xxx
            yyy
            zzz
   article_1
   article_2

Сохраняя имя динамического списка желаний как дочернее, вы можете просто изменить его, когда захотите, без необходимости читать узел, удалять узел, изменять имя и перезаписывать узел.

...