Swift 5 Firebase 按子/键查询
Posted
技术标签:
【中文标题】Swift 5 Firebase 按子/键查询【英文标题】:Swift 5 Firebase Query by child/key 【发布时间】:2022-01-02 22:38:36 【问题描述】:在我的数据库中,所有张贴的图片都有一个不断增加的相关联作为关键。
所以第一张图片有键“1”,第二张图片有键“2”,第1000张图片有键“1000”
现在我想查询它们按升序排列,包括分页。所以从最新的 10 开始,然后继续 11-20,依此类推。
如何在不使用子查询的情况下实现这一目标?目前我需要给它一个孩子(例如“id”然后是密钥)以便能够查询它。随着数据库的快速增长,这将导致不必要的保存数据。
例子
"root"
"images"
"1"
"id" : 1
"2"
"id" : 2
等等
我想删除“id”部分,仍然可以查询它+分页
目前我只有在包含子部分时才能正确查询。
【问题讨论】:
【参考方案1】:Firebase 实时数据库中的键始终是字符串。因此,即使您在其中输入数值,数据库也会将它们视为字符串。这在排序时尤其重要,因为字符串是按字典顺序排列的。
在字典中,这是一些相关键的正确顺序:
1
10
11
19
2
20
21
29
3
30
但您不太可能希望它们按此顺序排列,您希望键 10 (很好)在键 2 之后。
要解决此问题,您应该以固定长度存储密钥:
001
010
011
019
002
020
021
029
003
030
我在这里使用"0"
进行填充,但也可以使用空格。
一旦你像这样填充了键,你可以得到一个键的片段:
ref.queryOrderedByKey().queryStarting(atValue: "001").queryEnding(atValue: "010")
请注意,在 Firebase 中使用连续数字键是一种反模式。我建议阅读 Best Practices: Arrays in Firebase 以了解更多信息。
【讨论】:
感谢您的回复!我看到的这个问题是我不知道会发布多少张图片。所以我想我必须保持以前的方式。可以是 10k、100k、1 百万。 这是不使用顺序数字索引作为键的众多原因之一。但是,如果您选择保留这些,则必须选择最大数量的它们才能查询密钥,正如我在回答中所解释的那样。以上是关于Swift 5 Firebase 按子/键查询的主要内容,如果未能解决你的问题,请参考以下文章
Swift 5 Firebase queryOrderedBy 字符串值
如何在 Swift 上的 Firebase 中获取嵌套键中的值