首页 > 解决方案 > 如何将用户添加到 Firebase 编号数组

问题描述

我是 firebase 的新手,并试图在登录时将用户添加到聊天组。我的函数目前通过使用 childbyautoid 将用户附加到“成员”,但这会添加一个 firebase 生成的 ID 密钥和名为 uid 的密钥。

我想要做的是生成序列中的下一个数字作为键,用户 ID 作为值。

我在 Swift 中的功能:

let key = self.databaseRef.child("groups").child("-LEf3_zagKHB6qQEbTL7").child("members").childByAutoId().key
let newuser = ["uid": uid]
let childUpdates = ["/members/\(key)": newuser]
self.databaseRef.child("groups").child("-LEf3_zagKHB6qQEbTL7").updateChildValues(childUpdates)

当我尝试向组中添加第四个成员时,这就是我在 Firebase 中为组“LEf3_zagKHB6qQEbTL7”得到的...

{
  "description" : "The Tribe",
  "members" : {
    "0" : "5pw4MkVxKob8nXiHojTl61tQQ822",
    "1" : "FeP6H8H0PyVjMDcqwH3zbY0xAxg2",
    "2" : "ZtcfskmMydQmGIarYyKiuO6cKbh1",
    "-BdfJitm1T_fu1ssXcUY" : {
      "uid" : "dSiUpZfdRpXxE7WQL01T5lOUkfF2"
    }
  },
  "title" : "popupzendo"
}

我期待看到的是这个……

{
  "description" : "The Tribe",
  "members" : {
    "0" : "5pw4MkVxKob8nXiHojTl61tQQ822",
    "1" : "FeP6H8H0PyVjMDcqwH3zbY0xAxg2",
    "2" : "ZtcfskmMydQmGIarYyKiuO6cKbh1",
    "3" : "dSiUpZfdRpXxE7WQL01T5lOUkfF2"
    }
  },
  "title" : "popupzendo"
}

标签: swiftfirebasefirebase-realtime-database

解决方案


如果要顺序增加索引,首先必须读取整个数组,确定下一个索引,将新子索引设置为该索引,然后将其写回。整个事情必须在事务中发生,以消除其他人在同一时间也添加一个孩子并且他们都获得相同索引的机会。这也意味着当用户间歇性地与服务器断开连接时,该操作将不起作用。

如果所有这些听起来都比预期的要棘手,您可能会明白为什么 Firebase 的push()操作会生成不同类型的密钥。虽然它比顺序索引复杂得多,但它绕过了前面提到的所有问题:它不需要事务,没有冲突的机会,甚至不需要用户连接到服务器。

有关数组索引为何难以与大规模多用户场景结合的更多信息,请阅读经典博客文章最佳实践:Firebase 中的数组

如果您坚持使用数组索引,我建议您查看这些帖子:

有关在 Swift 中处理 Firebase 列表的更多信息,请参阅:


推荐阅读