首页 > 解决方案 > 在 Firebase 中创建用户 - 实时数据库

问题描述

我坚持创建一个 Firebase 用户。

创建我的数据库后看起来像这样

我创建了一个结构用户,但我不知道如何创建正确的字典

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}

帮助

标签: swiftfirebasefirebase-realtime-database

解决方案


我想您是在询问如何在涉及一个子节点时从实时数据库中填充用户对象,该子节点也是一个键:值对。

我的建议是使用 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]

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


推荐阅读