【问题标题】:Create User in firebase - Realtime Database在 Firebase 中创建用户 - 实时数据库
【发布时间】:2021-04-09 20:38:04
【问题描述】:

我坚持创建 Firebase 用户。

创建后我的数据库是这样的

我创建了一个 struct User 但我不知道如何创建正确的字典

struct User {
let email : String
let name : String
let lastname : String
let phone : String
let password : String
let uid: String
let car : [Car]

init(uid: String, dictionary: [String: Any] ) {
    self.uid = uid
    
    self.email = dictionary["email"] as? String ?? ""
    self.name = dictionary["name"] as? String ?? ""
    self.lastname = dictionary["lastname"] as? String ?? ""
    self.phone = dictionary["phone"] as? String ?? ""
    self.password = dictionary["password"] as? String ?? ""
    self.car = dictionary["car"] as? String ?? "" <- this is wrong
}


struct Car {
let firstCar : [FirstCar]}
struct FirstCar {
let brandName : String
let capacity : String
let carName : String
let fueal : String
let model : String
let power : String
let year : String}

帮助

【问题讨论】:

  • 这里有问题吗?你的代码和结构有什么问题,你想做什么?请查看以下两个关于提问的指南:How do I ask a good question?How to create a Minimal, Complete, and Verifiable example。另外,请不要在您的问题中包含图片或链接。将代码和结构包含为文本,以便我们可以通过复制/粘贴在答案中使用它们。要获取您的 Firebase 结构,请使用 Firebase 控制台->导出 JSON,然后复制并粘贴您的结构的 sn-p。
  • 另外,namename 字段也不会被填充,因为它的 lastName 在 firebase(大写 N)中。

标签: swift firebase firebase-realtime-database


【解决方案1】:

我认为您是在询问当涉及的子节点也是键:值对时如何从实时数据库中填充用户对象。

我的建议是使用 DataSnapshots 尽可能长时间地保持 Firebase 的“firebasey”,而不是强制转换为字典;它使从子节点获取数据变得更加容易和清晰。

这是从 Firebase 读取用户节点的示例

var userArray = [UserClass]()

func readAllUsers() {
    let usersRef = self.ref.child("users") //self.ref points to my firebase
    usersRef.observeSingleEvent(of: .value, with: { snapshot in
        for child in snapshot.children.allObjects as! [DataSnapshot] {
            let user = UserClass(userSnap: child)
            self.userArray.append(user)
        }
    })
}

然后是带有子键的 UserClass:值对与作为子的汽车品牌

class UserClass {
    var key = ""
    var userName = ""
    var userEmail = ""
    var type = ""
    var brand = ""
    
    convenience init(userSnap: DataSnapshot) {
        self.init()
        self.key = userSnap.key
        self.userName = userSnap.childSnapshot(forPath: "name").value as? String ?? "No Name"
        self.userEmail = userSnap.childSnapshot(forPath: "email").value as? String ?? "No email"

        let carSnap = userSnap.childSnapshot(forPath: "car") //retuns the car node
        let firstCarSnap = carSnap.childSnapshot(forPath: "firstCar") //return the firstCar node
        self.brand = firstCarSnap.childSnapshot(forPath: "brandName").value as? String ?? "No Brand"
    }
}

最好通过用户的 uid 来存储用户,并在对象中跟踪它,以防您需要在代码中的其他位置引用该用户或更新他们的节点。

注意上面代码中的这一行

for child in snapshot.children.allObjects as! [DataSnapshot]

在读入时保留用户的顺序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-26
    • 1970-01-01
    • 2020-10-02
    • 2020-10-16
    • 2021-06-10
    • 1970-01-01
    • 2021-07-30
    • 2016-11-03
    相关资源
    最近更新 更多