在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 ??");
});
}
答案 0 :(得分:0)
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
来了解何时将用户添加到任何办公室。
另请参阅: