hom*_*rrr 5 java android firebase firebase-realtime-database
至于关于这个主题和类似的问题ChildEventListener,没有相关的答案,所以继承我的.
我有一个本地SQLite数据库,其中包含所有数据,我还有Firebase实时数据库,我正在使用新条目或所有用户的实时更改进行更新.我目前正在使用ChildEventListener如下方法:
DatabaseReference rootRef = FirebaseDatabase.getInstance().getDatabase().getReference();
DatabaseReference childRef = rootRef.child("my_root");
ChildEventListener eventListener = new ChildEventListener()
{
....
};
childRef.addChildEventListener(eventListener);
Run Code Online (Sandbox Code Playgroud)
至于功能,使用此代码,我可以获得有关孩子的实时更改,获取新条目,删除子项以及我需要的所有内容但有一个问题.当监听器的这个特定活动加载时,onChildAdded监听器会在该根上为每个孩子调用大量的时间,如文档中所述:
child_added为每个现有子项触发一次,然后每次将新子项添加到指定路径时再次触发
所以我虽然专注于我真正需要的项目,但我已经完成了:
rootRef.orderByKey().startAt("-WhatTF123456789")...
Run Code Online (Sandbox Code Playgroud)
但后来我丢失了我的CRUD功能,因为它正在收听新条目,而不是所有条目.
所以我想出了一个解决方案.保留节点,其中包含对FireBase数据库所做的所有更改以及一个节点,其中所有用户已阅读并对本地数据库进行了更改以了解谁需要更新,然后使用addChildEventListener此特定节点.但这似乎是多余的.
我有什么选择来处理这种情况?
该
onChildAdded监听器被调用的次数巨额查找有关此根每一个孩子。
正如您已经提到的和文档所述,这是预期的行为。通常,不建议ChildEventListener在包含大量数据的节点(根节点)上附加。请注意这种做法,因为在下载大量数据时,您可能会遇到如下错误:OutOfMemoryError。之所以发生这种情况,是因为您隐式下载了您正在侦听的整个节点以及其下的所有数据。该数据可能以简单属性或复杂对象的形式出现。因此,可以认为这是对资源和带宽的浪费。在这种情况下,最好的方法是尽可能地扁平化数据库。如果您是NoSQL数据库的新手,这种做法称为反规范化这是Firebase的常见做法。为了更好地理解,我建议您看一下:
另请注意,在复制数据时,请记住一件事。用与添加数据相同的方式,您需要对其进行维护。换句话说,如果您想更新/删除项目,则需要在它存在的每个位置进行。
我还建议您从以下帖子中查看答案的最后一部分:
它适用于Cloud Firestore,但相同的规则适用于Firebase实时数据库。
但是后来我失去了CRUD功能,因为它正在侦听新条目,而不是全部。
Firebase中的所有内容都与侦听器有关。除非正在侦听它们,否则无法获取节点内对象的实时更新。因此,您不能限制结果,也不能期望从不监听的对象获取更新。如果需要获取节点内所有对象的更新,则需要侦听所有对象。由于这种方法根本不实用,因此您可以如上所述使用反规范化,也可以通过使用查询来限制结果,这些查询可以帮助您限制从数据库获取的数据量。关于您的解决方案,第二种方法是更可取的,但是您也可以考虑另一种方法,该方法是根据属性或所需的任何其他属性以较小的块加载数据timestamp。
编辑:根据您的评论:
您能否为每种解决方案(1.denormalization,2.my解决方案)提供测试,以检查带宽和资源的使用,哪一种是真正的首选?
所有数据均经过建模以允许应用程序需要的用例。不幸的是,我无法进行测试,因为它实际上取决于应用程序的用例及其所包含的数据量。这意味着对一个应用程序有效的功能可能对另一应用程序而言是不够的。因此测试可能并不适合所有人。反规范化过程或您的解决方案完全取决于您打算如何查询数据库。在上面的列表中,我添加了一个新资源,这是我对NoSQL数据库中反规范化技术的回答。希望它也能帮助访客。
| 归档时间: |
|
| 查看次数: |
418 次 |
| 最近记录: |