我的目标是使用Firebase创建排行榜,并在tableview中显示用户名,高分和区域。我当前的数据库看起来像
目前我手头有一切。我是这样做的,所以我可以增加当前用户的数据。不幸的是,通过这样做,我不认为我可以让别人看到别人的高分或用户名。 使用当前节点设置是否有解决此问题的方法,或者我是否需要更改它。如果是这样,有人可以举例说明数据库的外观。
答案 0 :(得分:4)
您应该将用户特定数据与排行榜分开。
您拥有用户节点,其中您的用户数据位于其唯一用户ID下。 然后,您还可以创建排行榜节点,并在相同的唯一用户ID下创建排行榜特定数据。这样,您不必一次获取所有数据,只知道用户特定数据。
连接是用户ID,即用户将要知道的唯一ID,并通过以下方式检索他/她的数据。其他玩家可以通过查询检索排行榜节点。您还应该存储一些看似冗余的数据,例如用户节点和排行榜都需要的用户名。
不要忘记应用安全规则,因此用户只能写入他/她的数据。
看起来像这样:
知道他/她的UID的经过身份验证的用户可以通过在此路径上获取数据来收听他/她自己的排行榜得分:“排行榜/ UID”正确。
其他玩家应该只需使用路径:“排行榜”来获取排行榜上的每个玩家。要订购它们并且只获取前十名玩家,你必须使用查询。
使用queryOrderedByChild按高分排序您的数据 为此,您还应添加安全规则:“。indexOn”:“highscore”。
获取前十名玩家使用 queryLimitedToFirst将其设置为10,它只会下载前10名玩家。
您应该阅读有关查询的更多信息:https://firebase.google.com/docs/database/ios/lists-of-data#sorting_and_filtering_data
答案 1 :(得分:2)
使用JSON时,树越平坦越好
HighScore :{
userID1 : 100,
userID2 : 103;
userID3 : 210;
},
Users :{
userID1 :{...}
userID2 :{...}
userID3 :{...}
}
如果要为用户添加不同的关系属性,只需为该特定用户添加另一个父节点并进行查询。
FIRDatabase.database().reference().child("HighScores").observeSingleEvent(of: .value, with: {(Snap) in
print(Snap.value)
})
PS: - 您始终可以在firebase中使用安全规则,以便将数据库中特定节点的权限操作给经过身份验证的用户Docs Link。
要在firebase节点中附加数据: -
FIRDatabase.database().reference().child("HighScores").observeSingleEvent(of: .value, with: {(Snap) in
if let snapDict = Snap.value as? NSMutableDictionary{
snapDict.setObject(_yourHighScore, forKey : FIRAuth.auth()!.currentUser!.uid as NSCopying)
FIRDatabase.database().reference().child("HighScores").setValue(snapDict)
}
})
答案 2 :(得分:1)
如果需要,您可以将所有内容存储在用户节点下。并通过基于高分应用排序来获取用户详细信息。您还应该应用限制。
如果您打算为用户详细信息和得分创建单独的节点,则必须从得分节点获取得分,并基于用户ID从用户节点获取用户详细信息。
答案 3 :(得分:0)
在@Durian的答案上,代码应如下所示,
let leaderboardDB = Database.database().reference().child("leaderboards")
leaderboardDB.queryOrdered(byChild: "score").queryLimited(toFirst: 100).observeSingleEvent(of: DataEventType.value, with: { (snapshot) in
if snapshot.exists() {
print("Retrieving Data!")
for child in snapshot.children {
print("Do whatever you need to do with the data")
}
} else {
print("DB no data!")
}
})
}
您可以将queryOrder方法调用与queryLimited方法链接在一起,以检索数据。您不必为包装排行榜数据的userId感到困扰,queryOrdered(byChild: "score")
方法将查看数据库中每个人的得分并相应地对其进行排序。