flutter - 从 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 ??");
});
}
解决方案
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
了解用户何时被添加到任何办公室。
另见:
推荐阅读
- tensorflow - 在 PyCharm 插件市场中找不到 TensorFlow 开发者证书插件
- django - 如何使用 model.objects.values() 从模型“函数”中检索数据?
- python - 检查谁登录了 Django 管理面板
- javascript - 如何使用自定义按钮控制 react-bootstrap 轮播?
- c# - 一次只能看到一个项目的 WPF 面板(替代 QML 的 StackLayout)?
- python - BeautifulSoup Python 得到一个名为“title”的元素
- pytorch - Pytorch 快速入门调用 model.eval() 但不调用 model.train()
- webpack - 在 PWA 服务工作者用例中将 sql.js 与 webpack 一起使用时出错
- c# - 需要帮助将帧保存到 QuickTime
- c++ - 为什么在没有附加声明的情况下不将友元函数视为声明它的类的命名空间的成员?