如何管理用户数据
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)
【讨论】:
以上是关于如何管理用户数据的主要内容,如果未能解决你的问题,请参考以下文章