【问题标题】:Firebase how to make this kind of query in SwiftFirebase 如何在 Swift 中进行这种查询
【发布时间】:2016-03-04 11:35:19
【问题描述】:

我有这个 JSON 结构:

{

  "groups" : {
    "-KBxo9-RoY0eowWKeHkU" : {
      "author" : "rsenov",
      "members" : {
        "-KBxo7ZU6McsmDOxyias" : true,
        "-KBxo8_TUTW6NZze6xcd" : true,
        "rsenov" : true
      },
      "name" : "Prueba 3"
    }
  },
  "users" : {
    "-KBxo7ZU6McsmDOxyias" : {
      "avatar" : "owl2",
      "groups" : {
        "-KBxo9-RoY0eowWKeHkU" : true
      },
      "isUser" : false,
      "name" : "Pepa"
    },
    "-KBxo8_TUTW6NZze6xcd" : {
      "avatar" : "monkey",
      "groups" : {
        "-KBxo9-RoY0eowWKeHkU" : true
      },
      "isUser" : false,
      "name" : "Lolas"
    },
    "rsenov" : {
      "avatar" : "guest",
      "groups" : {
        "-KBxo9-RoY0eowWKeHkU" : true
      },
      "isUser" : true,
      "name" : "Ruben",
    }
  }
}

安全&规则文件是:

{
  "rules": {
    ".read": true,
    ".write": true,
    "users": {
      ".indexOn": ["email", "groups"]
    },
    "groups": {
      ".indexOn": ["author", "name"]
    }
  }
}

我正在尝试运行查询以获取 ChildChanged 快照:

DataService.dataService.USERS_REF.queryOrderedByChild("groups").queryEqualToValue(currentGroup.groupKey).observeEventType(.ChildChanged, withBlock: {snapshot in
        print(snapshot)
    })

DataService.dataService.USERS_REF对应指向“users”键的url,在这种情况下currentGroup.groupKey等于-KBxo9-RoY0eowWKeHkU

根据这个查询,我应该得到改变的孩子的快照。例如,如果我将用户名“Pepa”替换为“Test”,我应该得到快照:

"-KBxo7ZU6McsmDOxyias" : {
  "avatar" : "owl2",
  "groups" : {
    "-KBxo9-RoY0eowWKeHkU" : true
  },
  "isUser" : false,
  "name" : "Test"
}

但是这个查询永远不会被调用... 我的查询有问题吗?

【问题讨论】:

  • @FrankvanPuffelen 对此有什么想法吗?会很感激的

标签: json swift firebase


【解决方案1】:

“我正在尝试运行查询以获取 ChildChanged 快照:”有点奇怪。

您可以查询数据,或通过 ChildChanged 观察节点。

如果您只想在用户节点内收到更改通知,请将观察者添加到该节点,当 Pepa 更改为测试时,您的应用将收到通知并提供更改的用户节点的快照。

var ref = Firebase(DataService.dataService.USERS_REF)

ref.observeEventType(.ChildChanged, withBlock: { snapshot in
    println("the changed user is: \(snapshot.value)")
})

哦,不需要 queryOrderedByChild,因为快照将只包含更改的单个节点。

【讨论】:

  • 感谢您的回答。我知道可以观察到 USERS_REF 发生变化的节点,但问题是不同设备中会有很多用户进行更改,我不希望每个用户在 USERS_REF 发生变化时都收到通知,只有与他们的用户和组有关的那些。这就是为什么我必须以某种方式只为属于特定组的用户更改孩子,例如DataService.dataService.USERS_REF.queryOrderedByChild("groups").queryEqualToValue(currentGroup.groupKey)
  • 我明白了。非常简单的解决方案:查询组中的所有用户,然后将观察者添加到这些用户节点。
  • 或者...并检查一下:创建一个组节点,并在该节点中有一个组列表,每个组都包含引用用户节点的子节点(user_d)。 /groups/some_group_name/uid_0:用户名。然后每个用户就可以观察自己的组节点​​,当用户名发生变化时,会通知他们。
  • 我已经有一个组节点,其中包含一个包含 user_id 的组列表。您可以在我的 JSON 结构中看到它。我认为更好的解决方案是您的首选
  • 是的,是的!我建议将用户名作为该节点的一部分而不是在用户节点中,这样您就可以在那里更改名称,这将触发 childChanged 事件。
猜你喜欢
  • 2021-05-12
  • 2016-10-11
  • 1970-01-01
  • 2017-12-21
  • 2018-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-05
相关资源
最近更新 更多