Swift Firebase - 如何更新多个参考的值?

Posted

技术标签:

【中文标题】Swift Firebase - 如何更新多个参考的值?【英文标题】:Swift Firebase -How to Update a Value at multiple refs? 【发布时间】:2019-12-31 18:34:00 【问题描述】:

当用户首次创建帐户时,我会检查他们选择的用户名是否在 all_usernames ref 下可用,这只是所有用户名的池。如果名称不在那里,我将他们的 userId 和用户名添加到该引用中(因此没有其他用户可以选择它),我还将其添加到 users 引用下方(这是他们的个人资料照片、用户名等所在的位置对于帖子)

-all_usernames
   |
   @--userId // kim_k's uid
       |
       |----username: "kim_k"

-users
   |
   @--userId // kim_k's uid
        |
        |---username: "kim_k"
        |---profileURL: "https//..."
        |---age: 27

我的应用有关注者和关注者。我有一个搜索栏,用户可以在其中搜索按姓名关注他们的人。

一切正常,但我遇到了问题。假设他们关注的用户是“kim_k”。

let searchText = searchController.searchBar.text?.lowercased() // "kim_k"

let currentUserId = Auth.auth().currentUser!.uid // a different user

followingRef.child(currentUserId)
    .queryOrdered(byChild: "username")
    .queryStarting(atValue: searchText)
    .queryEnding(atValue: searchText+"\uf8ff")
    .observeSingleEvent(of: .value, with:  (snapshot) in ... 

使用执行搜索的 currentUser 上方的代码将在其following ref 下方找到“kim_k”。如果 Jill 和 Jane(单独的用户)在他们的 ref 下搜索她的名字,他们也会这样做(纬度/经度位置是必要的):

-following
    |
    @--userId // currentUserId
    |    |
    |    @----userId // kim_k's uid
    |           |
    |           |----username: "kim_k"
    |           |----lat: 0.111
    |           |----lon: 0.222
    |
    |
    @--userId // jill's uid
    |    |
    |    @----userId // kim_k uid
    |           |
    |           |----username: "kim_k"
    |           |----lat: 0.333
    |           |----lon: 0.444
    |
    @--userId // jane's uid
         |
         @----userId // kim_k's uid
                |
                |----username: "kim_k"
                |----lat: 0.555
                |----lon: 0.555

如果“kim_k”将她的名字改为“kim_kardashian”会发生什么?

如果她要更改它,它将在users ref 和all_usernames ref 下更新。当 currentUserId、Jill 和 Jane 搜索她时,它会返回她的旧用户名。

“kim_kardashian”名称更改必须发生在users ref、all_usernames ref、following ref 和followers refs。

我该如何解决这个问题?

【问题讨论】:

我只关心非规范化数据,但这种额外的结构似乎没有必要。为什么在 all_usernames 节点中查询用户名,而您可以在 users 节点中查询相同的内容?此外,如果您正在跟踪您关注的用户,为什么不利用他们的 uid 而不是他们的名字呢?然后他们可以将其名称更改为任何名称,并且不会影响您的结构或查询。 hmmmmm,我从没想过。我想这是一个单独的问题。我的印象是用户名应该在一个完全不同的参考文献中。现在你提出来它是有道理的。谢谢。但即使我不使用 all_usernames 节点(我将删除它),我仍然处于如果 kim_k 更改了她的用户名,则更改需要反映在关注者和关注节点下 @Jay 我如何查询他们的用户 ID?当用户在 searchBar 中键入名称“kim_k”时,我需要引用用户名键。我将如何使用 uid 来做到这一点?你能举例说明你的意思吗? 好的,第一个关于必须更改以下节点下的用户名的问题。不要那样做。在我的评论中,我建议存储用户 uid 而不是他们的姓名。这样,名称或任何其他数据都可以随心所欲地更改,并且不会影响您的结构或查询,因为它们与用户唯一的 uid 相关联。 推荐阅读:***.com/questions/30693785/… 【参考方案1】:

回答问题

Swift Firebase - 如何更新多个引用的值?

更新多个参考很容易。假设你有一个结构

items
   item_0
      item_name: "some item 0"
   item_1
      item_name: "some item 1"

并且您想要更新两个项目名称。这是快速代码。

func updateMultipleValues() 
    let path0 = "items/item_0/item_name"
    let path1 = "items/item_1/item_name"

    let childUpdates = [ path0: "Hello",
                         path1: "World"
    ]

    self.ref.updateChildValues(childUpdates) //self.ref points to my firebase

结果是

items
   item_0
      item_name: "Hello"
   item_1
      item_name: "World"

编辑

这里确实有几个问题,所以上面专门展示了如何一次更新多个参考。但是,这实际上与实际问题无关。

不要将用户名存储在多个位置(对于此用例)。有时需要(非规范化)但这里不是。

10000'视图如下

如果我想知道关注当前用户的用户的名字,这里是一个开始。

/users
   uid_0 //assume this is the logged in user
      name: "My Name"
      followers
         uid_1 //uid_0 is being followed by uid_1
            some data
         uid_2
            some data
      following
         uid_3
  uid_1
      name: "Some other user name"
      followers
         whoever is following this user
      following
         uid_0 //uid_1 is following uid_0

然后为了得到谁在关注登录用户的名字,我们将使用一些伪代码来保持简短。

let myFollowerNode = firebase.users.myuid.followers //read in the followers node
myFollowerNode.observeSingleEvent(.value, with  snapshot in
    //get the array of keys from the snapshot which would be
    let userIdArray = keys(snapshot)
    //  uid_1
    //  uid_2
    for uid in userIdArray  //iterate over the uid's, reading in their names
       let aUser = firebase.users.uid.name
       aUser.observeSingleEvent(.value..... 
           let name = snapshot.value as! string //that users name

【讨论】:

感谢您的帮助。也许我看错了。看起来“item_0”和“item_1”将是 Jill 和 Jane 的 userId,但这意味着我需要事先这样做。几个人没问题,但有成百上千的人就不行了 @LanceSamaria 所以这个答案特定于关于如何更新多个参考的问题。它仍然可以完成(因为您会知道用户 uid),但更简单的解决方案不是将用户名存储在 /users/uid/username 节点中的任何其他位置。 这是我感到困惑的部分。我了解您是在说我做错了,或者应该以更有效的方式来做。我不明白的部分是如何做到这一点。当搜索查询出现在此处时: followingRef.child(currentUserId) .queryOrdered(byChild: "username").queryStarting(atValue: searchText 我需要知道他们在关注谁以及用户名。我不知道t 查看用户节点与以下节点的连接位置 1) 我明白你的意思,你确实正确回答了这个问题,谢谢。 2)我确实有很多事情发生在这里,我有点困惑自己。我可能应该以不同的方式问这个问题。 3) 您更新的答案不使用 .queryOrdered()/.queryStarting()。 4)我仍然对您更新的答案感到困惑。我还有一些问题,我可能需要在一个完全不同的线程中问他们。让我看看这个然后回复你。新年快乐,谢谢!!! @LanceSamaria 所以在你的问题中你说我有一个搜索栏,用户可以在其中搜索按姓名关注他们的人。我的问题是;您出于什么原因寻找它们。换句话说,在我的回答中,如果您是 uid_0,您就会知道 uid_1 和 uid_2 正在关注您。您还需要搜索什么。我没有使用 .query (还),因为用户列表在您的关注者列表中 - 正如我所提到的,您的查询是什么,因为他们已经在那里。

以上是关于Swift Firebase - 如何更新多个参考的值?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 iOS Swift 更新 firebase 中的单个数组元素?

如何在 Swift 4 中更新 Firebase 身份验证中的电子邮件地址

swift 4如何将firebase Crashlytics用于多个标识符IOS的多个捆绑标识符

如何使用 Swift 在 Firebase 中创建具有多个属性的用户?

Swift - 如何从 Firebase 检索多个值并将它们显示在 UITABLEVIEW

如何在 Swift Firebase 中更新一个集合中的所有文档