gpt4 book ai didi

ios - 列出 Firebase 数据和关系

转载 作者:行者123 更新时间:2023-11-29 11:41:33 26 4
gpt4 key购买 nike

我刚刚开始使用 Firebase 数据库,我对如何构建数据库感到有点困惑。在下面的示例中,我有一个用户对象和一个组对象。每个用户可以属于多个组,每个组可以有多个用户。根据“Structure Your Database”,建议的数据库结构如下。

{
"users": {
"alovelace": {
"name": "Ada Lovelace",
"groups": {
"techpioneers": true,
"womentechmakers": true
}
}
},
"groups": {
"techpioneers": {
"name": "Historical Tech Pioneers",
"startDate": "24-04-1820",
"members": {
"alovelace": true,
"ghopper": true,
"eclarke": true
}
}
}
}

假设我想在我的应用程序的列表中显示所有组,包括组名和开始日期。我将如何调用该数据库?由于用户对象只包含组的 ID,那么我是否必须为每个组单独调用数据库以找出组的名称和开始日期?如果列表中有很多组,那么就会变成很多调用。我的组可能还包含很多其他信息,因此这似乎不利于性能。我可以一次调用获取用户组列表中的所有组吗?


虽然我有一个方法是在用户下的组对象中包含名称和开始日期:

"users": {
"alovelace": {
"name": "Ada Lovelace",
"groups": {
"techpioneers":{
"name": "Historical Tech Pioneers",
"startDate": "24-04-1820"
},
"womentechmakers":{
"name": "Women in Technology",
"startDate": "13-10-1823"
}
}
}
}
}

但是这个解决方案好像增加了很多重复的数据。此外,如果我想更新名称,我将不得不在多个位置进行更新。也许我想添加一个赞助商组织对象,它也包含组,然后想列出它们。然后将有 3 个地方可以更新信息。我将如何解决这个问题?

最佳答案

然后您将有两种可能性,一种是将您需要的数据存储(复制)在每个用户的组节点中。

另一个,也是我最推荐的一个,是在你的第一个观察者中添加一个 observeSingleEvent(of: .value)(可以是一个 observe( .value)observe(.childAdded) 或其他)。

假设您有一个包含所有组成员的数组,以及一个名为 AppUser 的对象,代表您应用中的一个用户:

var groupMembers = [AppUser]()

例如,要检测何时将新成员添加到组中,您可以使用 .childAdded 观察者:

func groupWasAddedObserver(completion: @escaping () -> ()) {

// Add a .childAdded observer to the group's members node (groupId should be defined somewhere) :

groupsRef.child(groupId).child("members").observe(.childAdded, with: { [weak self] (snapshot) in

// When you get the snapshot, store its key, which represents the member id :

let memberId = snapshot.key

// fetch this member's profile information using its id :

self?.getUser(memberId, completion: { (groupMember) in

// Once you got the profile information of this member, add it to an array of all your members for example :

self?.groupMembers.append(groupMember)

// Call the completion handler so that you can update the UI or reload a table view somewhere maybe depending on your needs :

completion()

})
})
}

第二种获取用户数据的方法是:

func getUser(_ userId: String, completion: @escaping (AppUser) -> ()) {

// Add the observerSingleEvent observer :

usersRef.child(userId).observeSingleEvent(of: .value, with: { (snapshot) in

// Get the data you need using the snapshot you get :

guard let email = snapshot.childSnapshot(forPath: "email").value as? String else { return }
guard let name = snapshot.childSnapshot(forPath: "name").value as? String else { return }
guard let picUrl = snapshot.childSnapshot(forPath: "picUrl").value as? String else { return }

// Call the completion handler to return your user/member :

completion(AppUser(id: snapshot.key, email: email, name: name, picUrl: picUrl))

})
}

如您所见,您使用快照 key 获取每个用户的 memberId,并使用此 memberId 获取此特定用户数据。

关于ios - 列出 Firebase 数据和关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46252044/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com