Firebase iOS-密钥/值对不';t从数据库中物理删除
我将所有用户名保存在一个单独的节点中,以便在用户搜索用户名时运行搜索。我从节点中删除了一个名称,例如pizzaMan。问题是,即使它删除了,如果我在我的应用程序中对删除的名称进行搜索,它会说它可用,但当我实际查看数据库时,它显示它仍然存在(这意味着它不应该可用)这怎么可能?Firebase iOS-密钥/值对不';t从数据库中物理删除,ios,swift,firebase,firebase-realtime-database,Ios,Swift,Firebase,Firebase Realtime Database,我将所有用户名保存在一个单独的节点中,以便在用户搜索用户名时运行搜索。我从节点中删除了一个名称,例如pizzaMan。问题是,即使它删除了,如果我在我的应用程序中对删除的名称进行搜索,它会说它可用,但当我实际查看数据库时,它显示它仍然存在(这意味着它不应该可用)这怎么可能? @IBAction func deleteUsernameButtonTapped(_ sender: UIButton) { // the user's username is pizzaMan let
@IBAction func deleteUsernameButtonTapped(_ sender: UIButton) {
// the user's username is pizzaMan
let username = usernamesRef?.child("pizzaMan")
userName?.observeSingleEvent(of: .value, with: { (snapshot) in
if snapshot.exists() {
let key = snapshot.key
username?.child(key).removeValue()
print("username: \(key) has been deleted\n")
}
})
}
用户名pizzaMan已被删除,但在数据库中显示它仍然存在
如果我试图获取它,则允许我使用新值写入旧值,但一旦删除,它仍不应显示在数据库中。如果我理解您的问题,您的问题在于删除函数 让我重申我认为你所说的话。你想让pizzaMan的节点完全移除,是吗?试试这个:
@IBAction func deleteUsernameButtonTapped(_ sender: UIButton) {
// the user's username is pizzaMan
if let username = usernamesRef as? DatabaseReference{
username.child("usernames/pizzaMan").removeValue()
}
else{
print("Errors")
}
}
这就是您打算做的吗?删除值后立即尝试删除引用,第二,确实需要在此处执行观察事件吗?是的,您对我打算做的事情的理解是正确的。我会在一个小时左右试一下你的答案,然后再回来。从您的答案来看,问题似乎是由我在删除密钥之前实例化密钥引起的。我希望你的答案行得通,如果不行,我是来帮你的。问题是,据我所知,你的用户名/比萨人/比萨人会因为反应太晚而感到痛心。我试着完全像你张贴,但同样的问题存在的方式,我解释。它移除/删除键/值对,但当我查看数据库时,它就在我面前。然而,当我搜索时,它说它是可用的。顺便说一句,搜索其他任何东西都可以。如果我搜索另一个我没有删除的名字,它会说它不可用,如果我搜索一个不存在的名字,它会说它可用。只有在我删除它之后,问题才会出现。您是否在其他地方设置它?由于您使用的是
observeSingleEvent
,因此不会看到对数据库本地副本的更改(如果有)。您可能需要提供更多的代码。我唯一一次设置它是在用户首次注册并选择用户名时。在他们登录后,vc将被解除分配。我使用单例来管理Firebase中的所有内容,但创建用户名的特定调用应该在释放时销毁。您看到的代码与我使用的代码完全相同。
@IBAction func deleteUsernameButtonTapped(_ sender: UIButton) {
// the user's username is pizzaMan
if let username = usernamesRef as? DatabaseReference{
username.child("usernames/pizzaMan").removeValue()
}
else{
print("Errors")
}
}