如何管理用户数据

Posted

技术标签:

【中文标题】如何管理用户数据【英文标题】:How to manage user data 【发布时间】:2020-05-14 14:11:48 【问题描述】:

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

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

在我的测试项目中,我成功实现了 Firebase 电话身份验证,但我的数据管理一团糟。我在电话输入视图的按钮操作中调用 firebase,然后重定向到我的验证视图,在那里我检查用户是否在按钮操作中也给了我正确的验证号。

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

我想知道在哪里可以找到关于如何在我的 swift 应用程序中管理和存储用户数据的好文档。我真的很迷茫,我要去各个方向,我需要集中精力。

【问题讨论】:

【参考方案1】:

如果您想存储非常基本的用户数据,例如他们的姓名和电子邮件,您可以使用 FIRUser 的内置函数。添加 displayName 和 emailAddress 可以使用 Swift 完成,如下所示:

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

对于电子邮件:

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

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

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

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

设置好 Firestore 后,您想为您的用户创建一个集合,每个用户都会有一个包含其数据的文档,并且可以使用他们的 UID 来获取该文档。

当你创建一个用户时,你还想在你的 Firestore 数据库的用户集合中创建一个 doc,当你想访问用户数据时,你想读回这个数据。

为此,遵守 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)
        
    

【讨论】:

以上是关于如何管理用户数据的主要内容,如果未能解决你的问题,请参考以下文章

Oracle数据库如何授权收费

如何对MongoDB 3.2.7进行用户权限管理配置

如何给mongodb管理员权限

如何访问用户管理器数据库并进行远程编辑?

管理员使用codeigniter分配数据后,当用户登录时如何从postgresql数据库中获取特定数据?

如何在asp.net c#中处理数据库用户