我正在写数据库并尝试读取它,它总是显示:失败:使用Firebase中的用户规则时,permission_denied。我正在尝试从Firebase读写,以写入名字和姓氏。树的布局在下面。用户在第一个情节提要板上登录,并且读取和写入在不同的情节提要板上和视图控制器上。
我需要在与尝试获取信息的VC上进行身份验证吗?
我能够在不同的VC上生成UserID,所以我不知道接下来该怎么做。
WRITE
ref?.child(userID).child("FirstName").setValue(firstName.text!)
READ
if let snap = snapshot.value as? [String : AnyObject] {
if let firstNameResult = snap["FirstName"] as? String {
self.firstNameLabel.text = firstNameResult
}else{
print("Error")
}
}else{
print("User ID is not valid")
}
FIREBASE RULES
{
"rules": {
"users": {
"$uid": {
".read": "$uid === auth.uid",
".write": "$uid === auth.uid"
}
}
}
}
TREE LAYOUT
IdentificationStorage
USERID generated
FirstName
LastName
-修复阅读- 这是读取的工作方式,写入仅使用下面提供的代码Ken起作用!
let ref = Database.database().reference().child("users/\(userID)")
ref.observeSingleEvent(of: .value, with: { snapshot in
guard snapshot.exists() else { return print("Invalid User ID") }
self.firstNameLabel.text = snapshot.get("FirstName") as? String
guard snapshot.exists() else { return print("Invalid User ID") }
self.lastNameLabel.text = snapshot.get("LastName") as? String
})
}
答案 0 :(得分:2)
您的规则是正确的,唯一的问题是,在写入数据库时,您需要说userID
在users
节点下。记住要像这样初始化数据库:
let ref = Database.database().reference()
这是您更新的 WRITE 代码:
ref.child("users/\(userID)/FirstName").setValue(firstName.text!)
我个人希望为DataSnapshot
创建扩展名,以使字段的获取变得容易:
extension DataSnapshot {
func get(_ field: String) -> Any? {
return (value as? [String : Any])?[field]
}
}
只需将其复制并粘贴到ViewController
之外的任何位置。使用此功能,您可以将 READ 代码重构为此:
guard snapshot.exists() else { return print("Invalid User ID") }
self.firstNameLabel.text = snapshot.get("FirstName") as? String
作为一个旁注,惯例是将Firebase字段设置为lowerCamelCase,就像Swift
中的变量一样。