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 删除的数据仍然存在的主要内容,如果未能解决你的问题,请参考以下文章
使用 android studio java Recycler 视图从 Firebase 实时数据库中删除一个节点
孤荷凌寒自学python第五十四天使用python来删除Firebase数据库中的文档
Uncaught FirebaseError: Firebase: No Firebase App '[DEFAULT]' has been created - 在 vue.js 中调用 Fireba