如何在离线模式下保存一部分firebase实时数据库

How to save a part of firebase realtime database in offline mode

我想将 Firebase 数据库 (JSON) 中的特定路径存储在本地 phone 存储中,而不是实时 Firebase 数据库中的所有数据。假设我的 Firebase 数据库中的每个用户都有一个新闻提要路径,我只想保存为用户指定的新闻提要,而不是将整个无用数据加载到用户移动设备的本地存储中。

我从官方 Firabase site 那里读到这一段,其中提到

The Firebase Real-time Database synchronizes and stores a local copy of the data for active listeners. In addition, you can keep specific locations in sync.

DatabaseReference scoresRef = FirebaseDatabase.getInstance().getReference("scores");
    scoresRef.keepSynced(true);

如果这是我问题的解决方案,那么我可以直接使用这一行而不用写那行

FirebaseDatabase.getInstance().setPersistenceEnabled(true);

这两段代码并没有真正的关联。他们不做同样的事情。

keepSynced(true) 有效地保持监听器在给定引用上处于活动状态,从它被调用的那一刻起,只要应用程序是 运行,这样数据的本地版本总是在与服务器上的远程版本同步。

setPersistenceEnabled(true)只是激活SDK读取数据的本地缓存。启用持久化后,应用程序仍然可以查询之前读取的数据。对SDK读取的所有数据生效。启用持久性后,您无法控制缓存哪些数据 - 所有读取的数据最多缓存 10MB。当达到最大值时,最旧的数据将从缓存中逐出。

根据我的说法,最好的方法是解析 Firebase JSON 数据并将其映射到一个对象中,然后仅将您需要的数据保存在本地存储中(在您的情况下为新闻提要),然后在需要时访问它。

为此,您可以将Paper DB用作本地存储来存储特定数据,并在需要时随时使用。它将数据存储为键值对,因此您可以使用在数据库中插入数据时使用的相同键来访问您的数据。 (就像共享首选项一样)。 它将数据作为缓存存储在您的本地存储中,并使用 Kryo 序列化框架,该框架对于 I/O 操作非常快。

或者您也可以使用带 SQLite 的 Room(一个 google 库)来完成此任务。 还没有尝试过 Room,但我认为它会满足您的目的。 这是 Room

的官方文档