首页 文章

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

提问于
浏览
6

我是 FirebaseSwift 的新手,我喜欢这样做:

  • 在我们的名称(或电子邮件地址)中查询我的用户和 find only those that contain a certain String 并将其添加到阵列中 .

  • 获取所有用户并将其添加到阵列中 .

我对此问题的数据的相关部分如下所示:
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的输出是空的,带有ChildAdded的输出只有一个用户,即现在登录的用户 .

所以我的问题是:

  • 我可以使用我当前的数据结构进行此查询,还是我必须通过他们的uid摆脱用户的故事?

  • 如果是,我将如何更改我的代码,使其工作?

  • 如果不是,那么存储用户并以名称查询它们的最佳方法是什么?

  • 如何查询例如"muster"并且只获取用户simplelogin:1(Max Mustermann)?

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

Supplement

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

数据:

enter image description here

查询代码:
enter image description here

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

2 回答

  • 2

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

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

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

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

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

    • 如果可能,注册用户节点上的ObserveSingleEventOfType:FEventTypeValue . 这会将所有注册用户读入快照 .

    • 迭代快照并将每个用户读入一个数组(作为字典对象)

    • 然后使用NSPredicate提取所需的用户数组 .

    我已经进行了大量的测试和性能测试,除非你有数千名用户,否则它可以忽略不计 .

    希望有所帮助!

  • -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 对交易......

    value = snapshot.value key = snapshot.key

相关问题