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 中创建具有多个属性的用户?