我正在开发一个使用Firebase数据库存储数据的聊天应用程序。开发聊天应用程序时,通常的方法是保持数据库节点同步,以便您脱机访问消息。因此,当我实现Firebase脱机功能以保持数据节点同步时,问题就出现了。 Firebase建议了两个脱机访问数据的必需步骤:

启用磁盘持久性

通过使用以下代码行可以根据文档启用此功能(在本例中,我将其添加到应用程序类中):

FirebaseDatabase.getInstance().setPersistanceEnabled(true);




保持节点同步

只需将keepsynced(true)添加到您希望保持同步的任何数据库引用中即可启用此功能,如下所示:

ChatNode.keepSynced(true);


两者有什么区别?

根据Firebase团队在此站点上的答案,我推断出:

1)(磁盘持久性)将数据存储在设备磁盘上以在需要时使用它们,并且在您写入数据或读取数据时存储数据。

a)如果离线写入数据:数据将存储在磁盘上,并在再次联机时发送到数据库。

b)如果您脱机读取数据:已联机读取并保留在磁盘中并存储的侦听器,您将能够从磁盘脱机读取数据。

2)(保持true同步)将以两种方式保持数据库引用的同步:

a)如果还将(磁盘持久性)与(保持同步)一起使用,您将能够使数据在磁盘上保持同步...这似乎是(磁盘持久性)的默认行为。

b)如果您仅使用(保持同步),则仅存储到所谓的应用程序内存中。

问题

我确实设置了这两种方法,但是我的应用程序现在非常缓慢,缓慢,有时会自行停止。

问题

如果我上面说的所有事情都是正确的,那么这种脱机功能方法会对我的应用程序造成沉重负担吗?

如果我使许多侦听器保持同步并设置了持久性,那么磁盘上是否会充满数据?我应该清理数据吗?两种方法都可以自行清除磁盘上的数据吗?是否从内存中清除数据本身?

我想避免我的应用程序出现滞后和响应缓慢的情况,感谢您的帮助。

最佳答案

您的假设是正确的。如果您使用的是FirebaseDatabase.getInstance().setPersistenceEnabled(true);,则表示Firebase将创建数据库的本地副本,这也意味着,在脱机时所做的每个更改都将添加到queue中。因此,随着此队列的增加,本地操作和应用程序启动将变慢。因此,速度取决于该队列的维数。但是请记住,Firebase被设计为可在断开连接的短到中期内工作的联机数据库,而不是作为脱机数据库。

其次,如果正在使用许多侦听器,请不要忘记根据活动的生命周期删除侦听器,如下所示:

databaseReference.removeEventListener(valueEventListener);

10-08 00:27