在我的Flutter应用程序中,我想跟踪不同公司的员工位置,而不必拼合数据库(请参见下面的体系结构)。
问题1:如果我在办公室节点上设置了侦听器,是否可以从事件中获取父节点?
问题2:如果在数据库中创建了新的公司节点,如何在办公室的新公司上动态附加新的侦听器?
_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
了解何时将用户添加到任何办公室。
另请参阅:
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句