Firebase 删除的数据仍然存在

Posted

技术标签:

【中文标题】Firebase 删除的数据仍然存在【英文标题】:Firebase deleted data still there 【发布时间】:2017-09-16 11:04:28 【问题描述】:

我有一种我无法理解的行为。 我删除了firebase database 上的一个节点,并且在观察.value 期间仍然收到数据。但在 firebase 数据库中,该节点已被删除。

我有一个名为users_shoppinglists 的节点。以下是要观察存储的用户节点的所有 id。然后我迭代所有的 id 来观察并调用一个函数来观察每个 ID。

当我需要删除一个列表时,我会在 shoppinglists 节点上更新一个名为 status 的节点,并通过云功能删除此列表中的所有相关数据。

但在观察期间仍然收到数据。看来我在完全删除之前又收到了数据。

迭代所有的id:

func ObserveAllList() -> Void

    if currentUser == nil  return 

    self.ShowActivityIndicator()
    ref.child("users_shoppinglists").child(currentUser!.id!).observe(.value, with:  (usersListsSnap) in

        if usersListsSnap.value is NSNull  self.HideActivityIndicator(); return 

        for listSnap in usersListsSnap.children 

            let list = listSnap as! DataSnapshot

            self.ObserveSingleList(listID: list.key)

        

    )  (error) in

        NSLog(error.localizedDescription)
        let title = String.OnlineFetchRequestError
        let message = error.localizedDescription
        self.ShowAlertMessage(title: title, message: message)
        return

    



调用函数观察每个ID:

func ObserveSingleList(listID:String) -> Void 

    self.ShowActivityIndicator()
    ref.child("shoppinglists").child(listID).observeSingleEvent(of: .value, with:  (snapshot) in

        if snapshot.value is NSNull  self.HideActivityIndicator(); return 


        //Read listData
        var newList = ShoppingList()
        newList.id = snapshot.key
        newList.name = snapshot.childSnapshot(forPath: "listName").value as? String
        newList.owneruid = snapshot.childSnapshot(forPath: "owneruid").value as? String
        newList.relatedStore = snapshot.childSnapshot(forPath: "relatedStore").value as? String

        //Read List items
        self.ref.child("listItems").child(listID).observe(.value, with:  (itemSnap) in

            var newItems = [ShoppingListItem]()
            for items in itemSnap.children 

                let item = items as! DataSnapshot
                var newItem = ShoppingListItem()
                newItem.id = item.key
                newItem.listID  = listID
                newItem.isSelected = item.childSnapshot(forPath: "isSelected").value as? Bool
                newItem.itemName = item.childSnapshot(forPath: "itemName").value as? String
                newItem.sortNumber = item.childSnapshot(forPath: "sortNumber").value as? Int
                newItems.append(newItem)

            
            newList.items = newItems

            //Read List members
            self.ref.child("shoppinglist_member").child(listID).observe(.value, with:  (memberSnap) in

                var newMembers = [ShoppingListMember]()
                for members in memberSnap.children 

                    let member = members as! DataSnapshot
                    var m = ShoppingListMember()
                    m.memberID = member.key
                    m.status = member.value as? String
                    newMembers.append(m)

                
                newList.members = newMembers

                DispatchQueue.main.async 

                    if let index = allShoppingLists.index(where:  $0.id == listID )

                        allShoppingLists[index] = newList

                     else 

                        allShoppingLists.append(newList)

                    

                    self.HideActivityIndicator()
                    NotificationCenter.default.post(name: Notification.Name.ShoppingBuddyListDataReceived, object: nil, userInfo: nil)

                


            , withCancel:  (error) in

                self.HideActivityIndicator()
                NSLog(error.localizedDescription)
                let title = String.OnlineFetchRequestError
                let message = error.localizedDescription
                self.ShowAlertMessage(title: title, message: message)
                return

            )

        , withCancel:  (error) in

            self.HideActivityIndicator()
            NSLog(error.localizedDescription)
            let title = String.OnlineFetchRequestError
            let message = error.localizedDescription
            self.ShowAlertMessage(title: title, message: message)
            return

        )


    )  (error) in

        self.HideActivityIndicator()
        NSLog(error.localizedDescription)
        let title = String.OnlineFetchRequestError
        let message = error.localizedDescription
        self.ShowAlertMessage(title: title, message: message)
        return

    

云功能:

    //****************************************************************************************************************/
// Handles an action when status value changed in users_shoppinglists node
//****************************************************************************************************************/
exports.handle_ListStatusUpdate = functions.database.ref('/shoppinglists/listID').onUpdate(event => 

    var listData = event.data.val()
    console.log('Status', listData.status)

    //handle deleted by owner
    if (String(listData.status) == 'deleted by owner') 

        //Get all members to delete the list on their users_shoppinglists node
        return admin.database().ref('shoppinglist_member').child(event.params.listID).once('value').then(listMember => 

            var promises = []
            listMember.forEach(function (member) 

                promises.push(admin.database().ref('users_shoppinglists').child(member.key).child(event.params.listID).set(null).then(() => 

                    return admin.database().ref('shoppinglist_member').child(event.params.listID).set(null).then(() => 

                        // delete the original shopping list
                        return admin.database().ref('shoppinglists').child(event.params.listID).set(null).then(() => 

                            return admin.database().ref('listItems').child(event.params.listID).set(null).then(() => 

                            )

                        )

                    )

                ))

            )

        )

    

);/*********************************************************************************************************** */

【问题讨论】:

【参考方案1】:

在模拟器上遇到了这个问题。不仅是 .value,而且 .childRemoved 和 .childChanged 根本没有被触发(只有 .childAdded 有效)。

在 iPhone 上试过,效果很好。然后我对模拟器进行了“擦除所有内容和设置...”,它也开始在模拟器上再次工作。

我敢打赌,Firebase 缓存在开发过程中会变脏,而您在代码中添加或删除观察者并可能更改数据库中的结构,并且在某些时候它会停止适当的反应。

【讨论】:

以上是关于Firebase 删除的数据仍然存在的主要内容,如果未能解决你的问题,请参考以下文章

Firebase 身份验证:如何验证用户仍然存在

使用 android studio java Recycler 视图从 Firebase 实时数据库中删除一个节点

孤荷凌寒自学python第五十四天使用python来删除Firebase数据库中的文档

Firebase Facebook登录检查用户是不是存在

将数据从firebase函数返回到android [重复]

Uncaught FirebaseError: Firebase: No Firebase App '[DEFAULT]' has been created - 在 vue.js 中调用 Fireba