Swift Firebase查询有序搜索

时间:2019-03-24 07:32:28

标签: swift firebase firebase-realtime-database

我想使用queryStarting在firebase中进行搜索

我有一个baseStruct:

products
   Jakets
      red
         name: red
         categoryName: Jakets
   Pants
      blue
         name: blue
         categoryName: Pants
   ...

我尝试了

let strSearch = "re"
        Database.database().reference().child("products").queryOrdered(byChild:  "name")
            .queryStarting(atValue: strSearch)
            .queryEnding(atValue: strSearch + "\u{f8ff}")
            .observeSingleEvent(of: .value, with: { (snapshot) in

            print("snapshot= \(snapshot)")

        })

在firebase中,我添加了规则:

    {
  "rules": {
    ".read": true,
    ".write": true,
    "products": {
      "$someID": {
        ".indexOn": ["name"]
      }
    }
  }
}

但这给了我

  

snapshot =捕捉(产品)为空

如何更改代码以按名称搜索?

1 个答案:

答案 0 :(得分:0)

Firebase实时数据库查询功能在节点的列表上。您在某个位置执行查询,并返回该位置的直接子节点,这些子节点在已知路径上具有特定值。

例如,您可以执行以下操作来退回所有名称以re开头的夹克:

Database.database().reference().child("products/Jakets").queryOrdered(byChild:  "name")
    .queryStarting(atValue: "re")
    .queryEnding(atValue: "re\u{f8ff}")
    .observeSingleEvent(of: .value, with: { (snapshot) in
        ...
    })

但是您不能使用当前结构执行返回名称以re开头的夹克和裤子的查询。如果需要的话,您将必须:

  • 针对每种产品类型分别执行查询。
  • 或添加其他数据结构,以将所有产品名称存储在平面列表中。

有关此的更多信息,请参见: