从 Flutter 应用程序中的 Firebase 实时数据库事件获取父节点
Posted
技术标签:
【中文标题】从 Flutter 应用程序中的 Firebase 实时数据库事件获取父节点【英文标题】:Get parent nodes from Firebase realtime database event in flutter application 【发布时间】: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 ??");
);
【问题讨论】:
【参考方案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
以了解何时将用户添加到任何办公室。
另见:
Many to Many relationship in Firebase Firebase query if child of child contains a value【讨论】:
以上是关于从 Flutter 应用程序中的 Firebase 实时数据库事件获取父节点的主要内容,如果未能解决你的问题,请参考以下文章
Flutter 和 Firebase:从 Firebase 中的数组中删除项目(地图)
从 Flutter 中的 Firebase 存储获取下载 URL
如何从 Firebase 实时数据库中获取数据到 Flutter 中的列表中?
从firebase数据库flutter中的uid获取用户数据