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

时间:2015-03-16 14:24:40

标签: ios swift firebase querying firebasesimplelogin

我是 Firebase Swift 的新手,我在查询方面遇到了一些麻烦。 所以我基本上有两件事要做:

  1. 查询我的用户,仅查找名称(或电子邮件地址)中包含特定字符串的用户,并将其添加到数组中。
  2. 获取所有用户并将其添加到阵列中。
  3. 此问题的相关数据部分如下所示: enter image description here

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

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

    "registered_users": {
        ".read": true,
        ".write": true,
        ".indexOn": ["name"]
     }
    

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

    我还在他们的网站上阅读了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)")
                }
            })
        }
    

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

    所以我的问题是:

    1. 我可以使用我当前的数据结构进行此查询,还是必须通过他们的uid摆脱用户的故事?
    2. 如果是,我将如何更改我的代码,使其正常工作?
    3. 如果不是,那么存储用户的最佳方式是什么,并且可以通过名称查询它们?
    4. 我如何查询例如“集合”只获得用户simplelogin:1(Max Mustermann)?
    5. 我希望我的描述足够详细。请事先提供帮助。

      补编

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

      数据:

      enter image description here

      查询代码: enter image description here

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

2 个答案:

答案 0 :(得分:2)

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

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

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

其次,如果要查询,则需要展平数据,因为查询只会深入一级(无法真正查询子注释中的数据)

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

  1. 如果可能的话,ObserveSingleEventOfType:FEventTypeValue 注册用户节点。这会将所有注册用户读入快照。
  2. 迭代快照并将每个用户读入一个数组(作为字典对象)
  3. 然后使用NSPredicate提取您想要的用户数组。
  4. 我已经进行了大量的测试和性能测试,除非你有数千名用户,否则它几乎可以忽略不计。

    希望有所帮助!

答案 1 :(得分:-1)

回答你的问题

1)是的,您可以使用当前结构进行查询。查询可以让1个孩子深入,但不能在孩子的孩子中。

2)如果是,我将如何更改我的代码,使其正常工作?

以下是用户姓氏查询的快捷方式:

Firebase *usersNodeRef = your users node 'registered_users'
FQuery *allUsersRef = [usersNodeRef queryOrderedByChild:@"lastName"];
FQuery *specificUserRef = [allUsers queryEqualToValue:@"aLastName"];

[specificUser observeEventType:FEventTypeChildAdded withBlock:^(FDataSnapshot *snapshot) {

  NSDictionary *dict = snapshot.value;
  NSString *key = snapshot.key;

  NSLog(@"key = %@ for child %@", key, dict);

}];

我如何查询例如"鼓起"并且只获得用户simplelogin:1(Max Mustermann)?

在您的使用节点结构中,用户存储在带有密钥的节点中..密钥是simplelogin:1等.summer.key将显示该信息。所以它的关键/价值对交易......

value = snapshot.value key = snapshot.key