【问题标题】:Query users by name or email address using Firebase (Swift)使用 Firebase (Swift) 按姓名或电子邮件地址查询用户
【发布时间】:2015-05-18 17:02:32
【问题描述】:

我对 FirebaseSwift 还是很陌生,在查询时遇到了一些麻烦。 所以基本上我想做两件事:

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

我的数据与此问题的相关部分如下所示:

如您所见,我使用的是 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 的输出只有一个用户,即现在登录的用户。

所以我的问题是:

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

我希望我的描述足够详细。提前感谢您的帮助。

补充

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

数据:

查询代码:

那不正是我打算做的吗?

【问题讨论】:

  • 我们怎样才能像您一样保存数据?

标签: ios swift firebase querying firebasesimplelogin


【解决方案1】:

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

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

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

其次,如果你想查询,你需要扁平化你的数据,因为查询只深入一层(不能真正查询子笔记中的数据)

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

  1. 如果可能的话,观察SingleEventOfType:FEventTypeValue 注册用户节点。这会将所有注册用户读入快照。
  2. 遍历快照并将每个用户读入一个数组(作为字典对象)
  3. 然后使用 NSPredicate 提取您想要的用户数组。

我已经运行了许多测试和性能,除非您有成千上万的用户,否则它可以忽略不计。

希望有帮助!

【讨论】:

  • 感谢您的回答。但是你能不能再看看我的问题,因为我在最后添加了一些东西。
  • 还有一件事,向我的数据库添加另一个条目是否是个好主意,该条目将所有用户的名称存储在第一级(以便能够查询它)和 ID在第二个级别。这样,我可以在 name-db 中查找 Max Mustermann,从那里获取他的 ID,并通过查询他的 ID 在 register_users-db 中获取他的其余数据。或者那会是太多的开销吗?问题当然是,除非我创建另一个带有电子邮件地址的数据库条目,否则我将无法同时查找电子邮件地址。那也不好,对吧?
  • 在您的 getUsersFromFirebase 代码片段中:FEEventTypeValue 一次将整个数据节点读入单个快照。然后,您负责迭代该快照并提取所需的数据。因此,在块内,您可能希望利用内置功能(FDataSnapshot *child in snapshot.children){} 来获取每个孩子。
  • Value Event & Child added 做了两个不同的事情。上面的注释中描述了 value 事件。 Child added 事件做了两件事:1)它读取节点中的每个孩子,一次一个,为每个孩子执行一次块中的代码 - 这让您有机会说......读入初始数据对于 NSTableView。 2) 然后它等待一个孩子被添加,当它被添加时,块被执行。
【解决方案2】:

回答你的问题

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);

}];

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

在您使用的节点结构中,用户存储在带有密钥的节点中。密钥是 simplelogin:1 等。snapshot.key 将显示这一点。所以这是键/值对交易......

值 = 快照.值 key = 快照.key

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-25
    • 1970-01-01
    相关资源
    最近更新 更多