在 Firebase 实时数据库中实现用户名(swift 4)

Posted

技术标签:

【中文标题】在 Firebase 实时数据库中实现用户名(swift 4)【英文标题】:Implementing Username in Firebase Realtime Database (swift 4) 【发布时间】:2018-05-14 07:16:52 【问题描述】:

首先,抱歉我的英语不好,问了一个非常基本的问题。

我是 swift 和 ios 编程以及 Firebase 实时数据库的新手。

如何将用户的用户名引用到用户的帖子中?

我在想userId 可以作为一种参考键。

我的最终目标只是完成所有帖子(完成)并拥有发布者的用户名。

我使用过 phpmysql(以前从未使用过 JSON)并且通常可以毫无问题地实现这一点,但我不确定如何在 Firebase 中实现这一点,可能是因为我对查询不太确定.

我已经阅读了可用于 Firebase 和 question 的查询,但仍然不太确定,因为在我的情况下它有点不同。

谢谢。

【问题讨论】:

你到底想达到什么目的? @Rohit 我想获取发帖人的用户名。 您可以简单地将用户名存储在帖子下。在 nosql 中重复数据是很常见的。我建议您查看一些有关结构化 nosql 数据的帖子以获取更多信息。 @AndréKool 好的,谢谢! :) 虽然@AndréKool 建议很棒,但它会导致问题,例如,当用户名更改时,需要在数据库中的每个位置进行更改。当使用电子邮件地址并且用户想要保留其帐户但使用不同的电子邮件时,通常会发生这种情况。此外,如果您想执行查询,您将通过用户名而不是 uid 进行查询。根据您的用例,继续存储实际的用户名,但利用 uid 引用是一种安全的替代方案,它确实需要更多的代码,但可能会提供额外的灵活性。 【参考方案1】:

不幸的是,NoSQL 中没有连接。所以你要么必须执行另一个请求,要么复制数据。

执行另一个请求

非常简单,每次您使用用户的用户名时,您都会请求它。对于您始终需要的信息以及“从不”更改的信息(例如用户名),我不建议使用它。

复制数据

您可以使用post 直接添加用户名,也可以使用云函数数据库触发器自动复制您需要的数据。建议在用户名的情况下,但在可变信息的情况下可能会很棘手。

【讨论】:

【参考方案2】:

在您的控制器中,通过 id 从数据库中获取您的帖子:

class func getPosterId(post: Post, completion: @escaping ([Post]) -> Swift.Void) 

Database.database().reference().child("posts").observe(.value, with:  (snapshot) in
            if snapshot.exists() 
                var posts = [Post]()

                let values = snapshot.value as! [String: Any]
                let post = values[post.id]
                completion(post)
             
        )

然后在你的 ViewController 中从完成中捕获它并获取它的userId

【讨论】:

以上是关于在 Firebase 实时数据库中实现用户名(swift 4)的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Firebase 中实现基于角色的访问控制

如何在 Firebase 身份验证中实现多用户帐户登录和切换?

如何在 MVVM-C RxSwift 中实现 firebase 身份验证

在firebase中实现电话和电子邮件身份验证的最佳方法是一次性使用?

在聊天应用程序中实现推送通知

在 iOS 上使用 Firebase SDK 作为全新设备开始