我正在开发一个使用firebase数据库来存储数据的聊天应用。开发聊天应用程序时的常用方法是保持数据库节点同步,以便您脱机访问消息。因此,当我实现firebase脱机功能以保持数据节点同步时,问题就出现了。 Firebase建议了两个离线访问数据所需的步骤:
启用磁盘持久性
根据文档使用这行代码启用(在我的情况下,我将其添加到应用程序类中):
FirebaseDatabase.getInstance().setPersistanceEnabled(true);
和
保持节点同步
只需将keepsynced(true)添加到您希望保持同步的任何数据库引用即可启用此功能,如下所示:
ChatNode.keepSynced(true);
两者有什么区别?
根据firebase团队在本网站上的回答,我推断出:
1)(磁盘持久性)将数据存储在设备磁盘上以便在需要时使用它们,并且在您写入数据或读取数据时存储数据。
a)如果您离线写入数据:数据存储在磁盘上,并在您再次上线时发送到数据库。
b)如果您离线读取数据:在线阅读并保存在磁盘中并存储的侦听器,您将能够从磁盘脱机读取它。
2)(保持同步为真)将保持数据库引用以两种方式同步:
a)如果您还在使用(磁盘持久性)(保持同步),您将能够在磁盘上保持数据同步...这似乎是(磁盘持久性)的默认行为)。
b)如果您单独使用(保持同步),那么您只能存储到所谓的应用程序内存中。
问题
我确实设置了这两种方法,但我的应用程序现在非常迟缓且缓慢,有时会自行停止。
问题
如果我上面说的所有内容都是真的,那么这种离线功能的方法会对我的应用程序造成沉重负担吗?
如果我让许多侦听器同步并启用了持久性,那么磁盘是否会充满数据?我应该清理数据吗?磁盘上的数据是否在两种方法中都自行清除?数据是从内存中自行清除的吗?
我希望避免我的应用中的滞后和缓慢响应,感谢您的帮助。
答案 0 :(得分:1)
你的假设是正确的。如果您使用FirebaseDatabase.getInstance().setPersistenceEnabled(true);
表示Firebase将创建数据库的本地副本,这也意味着您在离线时所做的每项更改都将添加到queue
。因此,随着此队列的增长,本地操作和应用程序启动将减慢。所以速度取决于该队列的维度。但请记住,Firebase被设计为一个在线数据库,可以在短时间内中断,而不是作为脱机数据库。
其次,如果使用了很多听众,请不要忘记根据活动的生命周期删除听众:
databaseReference.removeEventListener(valueEventListener);