【问题标题】:Updating username across database跨数据库更新用户名
【发布时间】:2017-02-02 13:23:38
【问题描述】:

我刚刚开始开发一个应用程序,并且在我认为它是一个将数据存储在服务器端的有用解决方案之前玩过 Firebase。

我已经有了一个功能齐全的登录和注册系统,可以将您带到应用程序,但我已经做到了,因此您需要一个“用户名”才能通过“进一步”注册页面(用户设置个人资料信息的地方)。

目前,我有一条小纸条告诉用户,他们在设置用户名后将无法更新他们的用户名 - 但是我不太喜欢这个想法,尽管我觉得我别无选择,这就是为什么我在问。

如果我在多个地方多次使用用户名,如下所示:

{
    users: {
        id1234: {
            username: "SomeUser123",
            age: 20
        }
    }
    posts: {
        id445: {
            title: "Some title",
            content: "Some content",
            postedBy: "someUser123"
        }
    }
}

我将如何更新那个人的用户名,以便它也更新 Swift 中帖子的用户名字段(可能还有其他几个地方)?或者最好的选择是不允许用户更新他们的名字?这将是一种耻辱。

【问题讨论】:

  • 我确实想到的一件事是进行某种 JOIN,但我认为您不能在 Swift/Firebase 中做到这一点。这很不幸。
  • 我没有使用FireBase的经验,但是你为什么不用ID(UserId)?
  • @Arendax 据我所知,您无法在 Firebase 中加入,因为它有点像平面 JSON 数据库 - 这将是解决此问题的方法。
  • 这会有所帮助,但为什么不添加用户 ID?这将是解决方案。你可以将帖子链接到用户 ID
  • 创建对节点的引用并简单地更新您的值

标签: ios swift firebase firebase-realtime-database


【解决方案1】:

想到两种方法

1.轻松路线

如果您确定您只会在这两个地方使用username,那么我只需创建对它们的引用并简单地更新它们的值。这种方法很简单,但显然不可扩展。

let userReference = FIRDatabase.database().reference().child("users/id1234")

userReference.updateChildValues([
"values": [
    "sample0",
    "sample1"
    ]
])

对于帖子之一,您需要先过滤 postedBy,然后再更新值

2。多路径路由

这是最具可扩展性的选项,我建议您阅读 blog 关于它的内容。

【讨论】:

  • 这只是一个后续问题 - 当更新“帖子”对象并且我正在寻找用户 ID(postedBy)时,有没有办法通过 进行搜索所有个帖子?还是我必须在 `.child("posts/id1234") 中提供特定的帖子 ID?你帮了大忙。
  • 没有它的好伙伴。乐意效劳。因此,当您创建对 let postReference = FIRDatabase.database().reference().child("posts") 之类的帖子的引用时,postReference 实际上指向 post 头部的顶部。如果您实际打印返回的快照,这将返回所有帖子。现在您不想这样做,而是指向头部,但告诉 Firebase 按postedBy 过滤此数据。然后您所要做的就是更改postedBy 中的值。 Frank 很好地解释了这一点。
  • 或者当您过滤数据时,您必须按用户的旧用户名过滤它,因为这就是 Firebase 的功能。然后在检索此信息后,您可以继续将其更改为新用户名。
  • 非常感谢!今晚晚些时候我会测试所有这些,并会勾选你的答案:)
【解决方案2】:

您可以为此使用updateChildValues。

let uniqueId = "id1234" //In your case
let newName = "NewUserName"

let ref = FIRDatabase.database().reference().child("users").child(uniqueId)
ref.updateChildValues(["username":newName])

或者您也可以使用setValue 进行单字段更新

ref.setValue(["username":newName]) 

【讨论】:

  • 您有旧的用户名值吗?如果是,那么您可以从中获取用户 ID (id1234),然后从中更新用户名。
【解决方案3】:

也许最简单的方法是使用 Firebase uid 存储所有内容,但为每个 uid 维护一个单独的 displayName 表,然后将 uid 用于数据层,将 displayName 用于表示层。

这样,您只需在一个地方维护 displayName。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-05
    • 2021-07-20
    • 2013-06-28
    相关资源
    最近更新 更多