使用Firebase(Swift)按名称或电子邮件地址查询用户

X.X*_*per 6 querying ios firebase swift firebasesimplelogin

我对FirebaseSwift陌生,在查询方面我遇到了一些麻烦.所以我基本上有两件事要做:

  1. 查询我的用户,只查找名称(或电子邮件地址)中包含特定字符串的用户,并将其添加到数组中.
  2. 获取所有用户并将其添加到阵列中.

我对此问题的数据的相关部分如下所示: 在此输入图像描述

正如你所看到的,我正在使用Firebase的简单登录(后来我也想添加Facebook登录),我正在用他们的uid存储我的用户.

我的规则文件的一部分如下所示:

"registered_users": {
    ".read": true,
    ".write": true,
    ".indexOn": ["name"]
 }
Run Code Online (Sandbox Code Playgroud)

所以每个人都应该对这部分数据进行读写访问.

我还在他们的网站上阅读了Firebase iOS指南的"检索数据"部分,根据该指南,我获取所有用户名和电子邮件地址的代码应该有效,至少我是这么认为的.但事实并非如此.这是我的代码:

func getUsersFromFirebase() {
        let registeredUserRef = firebaseRef.childByAppendingPath("registered_users")
        registeredUserRef.queryOrderedByChild("name").observeSingleEventOfType(.Value, withBlock: { snapshot in
            if let email = snapshot.value["email"] as? String {
                println("\(snapshot.key) has Email: \(email)")
            }
            if let name = snapshot.value["name"] as? String {
                println("\(snapshot.key) has Name: \(name)")
            }
        })
    }
Run Code Online (Sandbox Code Playgroud)

我注意到,在firebase指南中,他们总是使用ChildAdded类型而不是Value,但对我而言Value更有意义.带有Value的输出是空的,带有ChildAdded的输出只有一个用户,即现在登录的用户.

所以我的问题是:

  1. 我可以使用我当前的数据结构进行此查询,还是我必须通过他们的uid摆脱用户的故事?
  2. 如果是,我将如何更改我的代码,使其工作?
  3. 如果不是,那么存储我的用户并通过名称查询它们的最佳方法是什么?
  4. 我如何查询例如"muster"并仅获得用户simplelogin:1(Max Mustermann)?

我希望我的描述足够详细.请事先提供帮助.

补充:

奇怪的是,"检索数据"指南说,可以按高度查询和排序以下数据.

数据:

在此输入图像描述

查询代码: 在此输入图像描述

这与我打算做的完全不一样吗?

Jay*_*Jay 2

我遇到过类似的情况,我想从子节点中提取数据。

https://groups.google.com/d/msg/firebase-talk/Wgaf-OIc79o/avhmN97UgP4J

我建议的第一件事是不要将 Firebase 查询视为 SQL 查询,因为它们不是。它们就像一个轻型查询。

其次,如果要查询,则需要展平数据,因为查询只能深入一层(无法真正查询子笔记中的数据)

最后 - 如果您不想扁平化数据,可以使用一种概念性选项来回答您的问题;

  1. 如果可能,请在注册用户节点上观察SingleEventOfType:FEventTypeValue。这会将所有注册用户读入快照。
  2. 迭代快照并将每个用户读入数组(作为字典对象)
  3. 然后使用 NSPredicate 提取所需的用户数组。

我已经进行了大量的测试和性能方面的测试,除非您有数千个用户,否则它可以忽略不计。

希望有帮助!