2017-07-16 103 views
0

我想从每个用户名称值中搜索我的用户群。从我在网上看到的人们经常会返回全部用户然后在表格视图中过滤它们,但这看起来不切实际也不可行。我的想法是查询数据并返回指数级数值的数组,但我无法使用提供的查询方法。高效查询firebase

如何查询我的数据库的特定方面?

我该如何构造我的代码,使其可行;不会在每个用户中加载,一次最多为10个。

任何建议,资源和链接非常感谢。

编辑:

我做了一些研究和它看起来像火力地堡带有一些内置的查询方法......到目前为止,这是我试图用代码来测试它下面的打印从用户开始我的,但我不能让它打印任何用户在控制台

ref.queryOrderedByKey().queryStarting(atValue: "I").queryEnding(atValue: "I\u{f8ff}") 
     .observe(.childAdded, with: { snapshot in 
      print(snapshot.key) 
     }) 
+0

1)你的问题是过于宽泛。 2)显示你的尝试。 3)所有的问题很容易谷歌。 GL –

+0

@VladPulichev我编辑的问题了一下。此外,如果你可以点我到这将是巨大的任何资源。 – Stefan

回答

0

有许多解决方案,并时常加载所有用户数据的数据过多。

下面是一个典型的用户节点

users 
    uid_0 
    name: "Jean Luc" 
    uid_1 
    name: "Will" 
    uid_2 
    name: "Geordi" 

一个选择是通过每个用户节点,一次一个迭代,以获取用户名。这完全避免了庞大的数据集。我们将使用.childAdded事件加载每个和存储在一个阵列

let usersRef = self.ref.child("users") 
    var userNamesArray = [String]() 

    usersRef.observe(.childAdded, with: { snapshot in 
     let userDict = snapshot.value as! [String: Any] 
     let name = userDict["name"] as! String 
     userNamesArray.append(name) 
    }) 

第二选项是对用户名存储在一个完全不同的节点,该节点显著降低了“杂波”为一体的其余部分数据保留在主节点的用户

user_names 
    uid_0: "Jean Luc" 
    uid_1: "Will" 
    uid_2: "Geordi" 

正如你可以用这个结构看,即使有成千上万个名字,它只是一个非常小的足迹文本。

另一种方法是使用.startingAt和.endingAt一次加载X个用户,并遍历返回的用户以获取每个名称。在这种情况下,我们希望所有用户以A开头并以M结尾......对不起Worf。

let usersRef = self.ref.child("users") 
    var userNamesArray = [String]() 

    let nameQuery = usersRef.queryOrdered(byChild: "name") 
          .queryStarting(atValue: "A") 
          .queryEnding(atValue: "M\u{f8ff}") 
    nameQuery.observe(.value, with: { snapshot in 
     for child in snapshot.children { 
      let snap = child as! DataSnapshot 
      let userDict = snap.value as! [String: Any] 
      let name = userDict["name"] as! String 
      userNamesArray.append(name) 
     } 
    }) 

的最后一个例子开始以A开头的用户名和与用户名结束了以M结尾+非常高的Unicode字符,这使得它包容了所有的名字开始以M

的\在上面的查询中使用的uf8ff字符是Unicode范围中的非常高的代码点 。因为它是在 Unicode中最常用的字符之后,所以查询匹配以queryString开头的所有值。