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 按子/键查询的主要内容,如果未能解决你的问题,请参考以下文章

Firebase - iOS SDK - 按子值过滤

Swift 5 Firebase queryOrderedBy 字符串值

Firebase 按子值搜索

如何在 Swift 上的 Firebase 中获取嵌套键中的值

将 async/await (Swift 5.5) 与 firebase 实时数据库一起使用

Firebase 获取数据