从 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获取用户数据

从 Flutter Web 应用程序发送 Firebase 存储授权作为 url 参数

如何从 Flutter 中的 Firebase 实时数据库中按 categoryId 获取产品?