【问题标题】:Get parent nodes from Firebase realtime database event in flutter application从 Flutter 应用程序中的 Firebase 实时数据库事件获取父节点
【发布时间】:2020-10-02 02:17:13
【问题描述】:

在我的 Flutter 应用程序中,我想跟踪不同公司的员工位置,而不必扁平化数据库(参见下面的架构)。

Q1:如果我在办公室节点上设置监听器,有没有办法从事件中获取父节点?

Q2:如果在数据库中创建了一个新的公司节点,如何在办公室的新公司上动态附加一个新的监听器?

 _employeesQuery = databaseReference.reference().child("Company_1/Office_1");

_onEmployeeAddedSubscription =
    _employeesQuery.onChildAdded.listen(onEmployeeAdded);

...

onEmployeeAdded(Event event) {
   setState(() {
     String name = event.snapshot.key;
     print("New employee added $name in Office ?? in Company ??");
   });
}

【问题讨论】:

    标签: flutter firebase-realtime-database


    【解决方案1】:

    Firebase 的文档建议使用 avoid nesting data and flatten data structure 是有充分理由的。您在这里没有遵循该建议,这就是您的数据结构与用例不匹配的原因。

    Firebase 子侦听器在子节点的平面列表上工作,它们不了解层次结构。因此,在您的模型中,您可以收听所有办公室,然后在办公室发生变化时获取childChanged,或者您可以收听特定办公室,然后在将用户添加到该办公室时获取childAdded。如果您听取所有办公室的意见,您将不得不弄清楚您的应用程序代码发生了什么变化。

    按照 Firebase 的建议,我实际上会将您的数据建模为两个顶级列表:

    userOffices: {
      "Dan": "Company_1/Office_1",
      "Tom": "Company_1/Office_1",
      "Pete": "Company_1/Office_2",
      "max": "Company_1/Office_2"
    },
    officeUsers: {
      "Company_1-Office_1": {
        "Dan": true,
        "Tom": true
      },
      "Company_1-Office_2": {
        "Pete": true,
        "max": true
      }
    }
    

    确切的模型可能有点不同,但重要的是我们已经在两个方向上存储了他的数据。您现在可以为办公室细化用户,并通过直接查找为用户细化办公室。并且您可以收听userOffices 以了解何时将用户添加到任何办公室。

    另见:

    【讨论】:

      猜你喜欢
      • 2020-04-27
      • 2020-05-12
      • 1970-01-01
      • 2021-03-04
      • 1970-01-01
      • 2019-04-13
      • 1970-01-01
      • 2021-09-08
      • 2019-10-11
      相关资源
      最近更新 更多