gpt4 book ai didi

java - Android Firebase 如何处理实时服务器到本地数据库的连接

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:23:48 29 4
gpt4 key购买 nike

关于这个主题和ChildEventListener的类似问题,没有相关的答案,所以这是我的。

我有一个保存所有数据的本地 SQLite 数据库,我还有一个 Firebase 实时数据库,我正在更新所有用户的新条目或实时更改。我目前正在使用 ChildEventListener 进行操作,如下所示:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getDatabase().getReference();
DatabaseReference childRef = rootRef.child("my_root");

ChildEventListener eventListener = new ChildEventListener()
{
....
};
childRef.addChildEventListener(eventListener);

至于功能,使用这段代码我可以实时更改子项、获取新条目、删除子项以及我需要的一切,但有一个问题。当此特定 Activity 与监听器一起加载时,onChildAdded 监听器会为此根上的每个子项调用大量次数,如文档中所述:

child_added is triggered once for each existing child and then again every time a new child is added to the specified path

所以我想把注意力集中在我真正需要的东西上,我已经做到了:

rootRef.orderByKey().startAt("-WhatTF123456789")...

但是后来我失去了我的 CRUD 功能,因为它正在监听新条目而不是所有条目。

所以我想到了一个解决方案。保留一个节点包含对 FireBase 数据库所做的所有更改,一个节点包含所有已读取本地数据库并对本地数据库进行更改的用户,以了解谁需要更新,然后使用 addChildEventListener 来这个特定的节点。但这似乎是多余的。

我有什么选择来处理这种情况?

最佳答案

The onChildAdded listener gets called enormous amounts of times for every child on this root.

正如您已经提到的和文档所述,这是预期的行为。通常,不建议在包含大量数据的节点(根节点)上附加 ChildEventListener。请注意这种做法,因为在下载大量数据时,您可能会遇到类似以下的错误:OutOfMemoryError .发生这种情况是因为您隐式下载了正在监听的整个节点及其下的所有数据。该数据可能以简单属性或复杂对象的形式存在。所以它可以被认为是资源和带宽的浪费。在这种情况下,最好的方法是尽可能扁平化数据库。如果您不熟悉 NoSQL 数据库,这种做法称为非规范化,是 Firebase 的常见做法。为了更好地理解,我建议您看一下:

另请注意,在复制数据时,需要牢记一件事。以与添加数据相同的方式,您需要维护它。换句话说,如果你想更新/删除一个项目,你需要在它存在的每个地方进行。

我还建议您从以下帖子中查看我答案的最后一部分:

它适用于 Cloud Firestore,但同样的规则适用于 Firebase 实时数据库。

But then I have lost my CRUD capabilities because it's listening to the new entries and not all of them.

Firebase 中的一切都与听众有关。您无法获得节点内对象的实时更新,除非您正在收听它们。所以你不能限制结果并期望从你没有收听的对象中获得更新。如果您需要获取节点内所有对象的更新,则需要监听所有这些对象。因为这种方法根本不实用,所以您可以使用上面解释的非规范化,或者通过使用可以帮助您限制从数据库中获取的数据量的查询来限制结果。关于您的解决方案,第二种更受欢迎,但您也可以考虑另一种方法,即根据 timestamp 属性或根据任何您需要的其他属性(property)。

编辑:根据您的评论:

Can you please provide tests for each solution (1.denormalization, 2.my solution) examine use of bandwidth and resources and which one is really preferred?

所有数据都经过建模以支持应用所需的用例。不幸的是,我无法进行测试,因为它实际上取决于应用程序的用例及其包含的数据量。这意味着适用于一个应用程序的内容可能不适用于另一个应用程序。所以测试可能对每个人都是正确的。非规范化过程或您的解决方案完全取决于您打算如何查询数据库。在上面的列表中,我添加了一个新资源,这是我对 denormalization tehnique in NoSQL databases 的回答。 .希望它也能帮助介绍访问者。

关于java - Android Firebase 如何处理实时服务器到本地数据库的连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54169121/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com