如何管理用户数据

时间:2020-05-14 14:11:48

标签: firebase swiftui

我目前正在学习如何使用SwiftUI使用Firebase和Firestore数据库。 我想知道什么是组织和管理用户数据的最佳方法。

我已经进行了一些研究,但我仍然很困惑。

在我的测试项目中,我成功实现了Firebase Phone Auth,但是我的数据管理一团糟。我在“电话输入”视图上的“按钮”操作中调用了Firebase,然后重定向到“验证”视图,在该视图中,我还检查用户是否在按钮操作中也给了我良好的验证码。

我听说过Model,View,ViewController模型,我正在尝试实现它。 那意味着,我需要拥有一个包含所有用户属性的用户结构,才能在整个应用程序中读取它们?

我想知道在哪里可以找到有关如何在我的swift应用程序中管理和存储用户数据的良好文档。我真的很困惑,我正在四面八方,我需要集中精力。

1 个答案:

答案 0 :(得分:0)

如果要存储非常基本的用户数据,例如其名称和电子邮件,则可以使用FIRUser的内置功能。可以使用Swift这样添加displayName和emailAddress:

let changeRequest = Auth.auth().currentUser?.createProfileChangeRequest()
changeRequest?.displayName = displayName
changeRequest?.commitChanges { (error) in
  // ...
}

和电子邮件:

Auth.auth().currentUser?.updateEmail(to: email) { (error) in
  // ...
}

但是,如果要存储特定于应用程序功能的自定义用户数据,我建议使用Firestore(Firebase提供的数据库平台)。

使用本教程使用Firestore设置您的应用程序:

https://firebase.google.com/docs/firestore/quickstart

设置了Firestore后,您要为用户创建一个集合,每个用户都将拥有一个包含其数据的文档,可以使用其UID来获取该文档。

创建用户时,您还希望在Firestore数据库的用户集合中创建一个文档,并且当您要访问用户数据时,您想要回读此数据。

为此,遵循ObservableObject的类效果很好。

确保导入FirebaseFirestore和FirebaseAuth。

首先创建一个自定义结构来保存我们用户的值。这些都是完全可定制的,我仅列举一些示例。这些功能可能非常复杂,并且专门针对您的应用功能。

struct CustomUser {
    var name: String
    var favouriteColor: String
    var dateCreated: Date
    var age: Int
}

创建这样的课程

class UserFetch: ObservableObject {
    // ...
}

然后,我们需要一个保留用户的变量。为确保已更新,我们使用@Published属性包装器。我们还要添加一个变量,为我们的用户保存Firestore集合。

class UserFetch: ObservableObject {
    @Published var user: CustomUser?

    var collection: CollectionReference = Firestore.firestore().collection("users")
    // ...
}

现在,我们要编写一个将数据写入文档的函数:

class UserFetch: ObservableObject {
    @Published var user: CustomUser?

    var collection: CollectionReference = Firestore.firestore().collection("users")

    func createUser(withName: String, favouriteColor: String, dateCreated: Date, age: Int, forUserID: String) {
        self.collection.document(forUserID).setData(["name": withName,
                                                     "favouriteColor": favouriteColor,
                                                     "dateCreated": dateCreated,
                                                     "age": age]) { (error) in
            if error != nil {
                print((error?.localizedDescription)!)
                return
            } else { print("CREATED DATA - USER: \(forUserID)") }
        }
    }
    // ...
}

创建用户时,请调用此函数。

现在我们需要从Firestore中读取用户

class UserFetch: ObservableObject {
    @Published var user: CustomUser?

    var collection: CollectionReference = Firestore.firestore().collection("users")

    func createUser(withName: String, favouriteColor: String, dateCreated: Date, age: Int, forUserID: String) {
        self.collection.document(forUserID).setData(["name": withName,
                                                     "favouriteColor": favouriteColor,
                                                     "dateCreated": dateCreated,
                                                     "age": age]) { (error) in
            if error != nil {
                print((error?.localizedDescription)!)
                return
            } else { print("CREATED DATA - USER: \(forUserID)") }
        }
    }
    
    func fetch(uid: String) {
        self.collection.document("\(uid)").addSnapshotListener { (snapshot, error) in
            if error != nil {
                print((error?.localizedDescription)!)
                return
            } else {
                print("READ USER DATA")
            }
        
            self.user = CustomUser(name: snapshot?.get("name") as? String ?? "", favouriteColor: snapshot?.get("favouriteColor") as? String ?? "", dateCreated: (snapshot?.get("dateCreated") as! Timestamp).dateValue(), age: snapshot?.get("age") as? Int ?? 0)
        }
    }
}

最后,添加一个读取此数据的初始化程序。

class UserFetch: ObservableObject {
    init(uid: String) {
        fetch(uid: uid)
    }
    @Published var user: CustomUser?

    var collection: CollectionReference = Firestore.firestore().collection("users")

    func createUser(withName: String, favouriteColor: String, dateCreated: Date, age: Int, forUserID: String) {
        self.collection.document(forUserID).setData(["name": withName,
                                                     "favouriteColor": favouriteColor,
                                                     "dateCreated": dateCreated,
                                                     "age": age]) { (error) in
            if error != nil {
                print((error?.localizedDescription)!)
                return
            } else { print("CREATED DATA - USER: \(forUserID)") }
        }
    }
    
    func fetch(uid: String) {
        self.collection.document("\(uid)").addSnapshotListener { (snapshot, error) in
            if error != nil {
                print((error?.localizedDescription)!)
                return
            } else {
                print("READ USER DATA")
            }
        
            self.user = CustomUser(name: snapshot?.get("name") as? String ?? "", favouriteColor: snapshot?.get("favouriteColor") as? String ?? "", dateCreated: (snapshot?.get("dateCreated") as! Timestamp).dateValue(), age: snapshot?.get("age") as? Int ?? 0)
        }
    }
}