首页 > 解决方案 > 从 Flutter 应用程序中的 Firebase 实时数据库事件获取父节点

问题描述

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

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 ??");
   });
}

数据库架构

标签: flutterfirebase-realtime-database

解决方案


Firebase 的文档建议避免嵌套数据和扁平化数据结构是有充分理由的。您在这里没有遵循该建议,这就是您的数据结构和用例之间不匹配的原因。

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了解用户何时被添加到任何办公室。

另见:


推荐阅读