【问题标题】:Firebase using queryEqualTo() two timesFirebase 使用 queryEqualTo() 两次
【发布时间】:2017-01-04 11:29:18
【问题描述】:

我的数据库中有以下数据结构:

我确实了解如何用一种语言(例如 de:)查询问题:

let ref = FIRDatabase.database().reference().child("madeGames")
    ref.queryOrderedByChild("de").queryEqualToValue(true).observeSingleEventOfType(FIRDataEventType.Value) { (snap: FIRDataSnapshot) in
        print("Data:", snap.value)
    }

问题:

我似乎不可能从服务器上获取 de AND en 中的游戏。

当然我知道我可以先下载所有问题,然后循环将它们离线,但这对我来说似乎不是很聪明。

有谁知道如何提高效率?

【问题讨论】:

  • groups.google.com/forum/#!topic/firebase-talk/ZDHKwxRMiKQ,关注这个帖子,尽管firebase团队还没有提供解决方案......但请继续检查......:)
  • 您确实无法在 Firebase 中使用任何内置功能查询(多个 where 查询)多个子节点。但是,有很多方法可以做到这一点。 @DavidEast 创建了可能感兴趣的库Querybase
  • @Jay 谢谢,但是 Querybase 也可以离线使用,对吧?

标签: ios json swift firebase firebase-realtime-database


【解决方案1】:

一种可能的选择是通过将子属性组合成这样的单个属性来更改结构。

made_games
   -jjjjsd903
      de_en: true
      de_fr: true
   -j090iQ0ss
      de: true

如果你有很多语言,你也可以这样做:

made_games
   -jjjjsd903
      language_available: 0   //just de
   -j090iQ0ss
      language_available: 3   //de_en

languages_available
    0: de
    1: en
    2: fr
    3: de_en
    4: de_en_fr

编辑 - 以及我刚刚想到的另一个选项...转为二进制!

00000001 = en
00000010 = fr
00000100 = de
00001000 = du
00010000 = ge

然后要获得任何语言组合,请对所需的两种(或更多)执行按位“或”运算。

所以要获得 en_de,它是 00001001。要获得 en_du_ge,它将是 00011001。如果您有 8 种语言,则可以用 8 位和 256 种组合表示。所以如果你有 11 种语言,那将是 2^11 = 多达 4096 种组合。

使用这种技术,您可以完全避免存储 en_fr 等,而只需搜索按位值。

您可以在 Firebase 中存储二进制数的十进制版本...为了清楚起见,这里只显示二进制数。

【讨论】:

  • 我也想过,但是如果你有 50 种语言,你将有 2500 个键值对要存储,这将是大量数据
  • 磁盘空间很便宜,2500 的存储空间也不算多。但是..为了保持整洁,您可能希望保留对组合的引用,而不是将数据保留在每个节点中,我更新了答案
  • @M.Kremer 有另一个想法可能非常有效,所以我更新了答案。
猜你喜欢
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
  • 2016-10-07
  • 1970-01-01
  • 2017-08-03
  • 2018-10-02
  • 2021-06-29
  • 2019-08-15
相关资源
最近更新 更多