【问题标题】:How to save a part of firebase realtime database in offline mode如何在离线模式下保存一部分firebase实时数据库
【发布时间】:2019-01-11 22:11:49
【问题描述】:

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

我从官方Firabase site 那里读到了这段话

Firebase 实时数据库为活动的侦听器同步并存储数据的本地副本。此外,您可以使特定位置保持同步。

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

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

FirebaseDatabase.getInstance().setPersistenceEnabled(true);

【问题讨论】:

    标签: android firebase firebase-realtime-database real-time


    【解决方案1】:

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

    keepSynced(true) 有效地让监听器在给定的引用上保持活跃,从它被调用的那一刻起,只要应用程序正在运行,因此本地版本的数据始终与服务器上的远程版本同步.

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

    【讨论】:

    • 感谢您的澄清,那么如何使firebase从数据库而不是整个数据库加载特定的参考
    • 只听你想加载的 ref。除非您收听根 ref,否则整个数据库不会同步。
    • ammm,是的,我知道,但是通过调用setPersistenceEnabled(true),整个数据库将存储在移动设备上,我想避免这个过程,因为我的数据库太大了,我只想解析一个小的部分,并避免加载/使用无用的数据/内存
    • 您误会了 - 请再次阅读我的回答。启用持久化后,只有实际读取的数据会缓存在本地,启用持久化后,您无法选择缓存哪些读取的数据。
    • 请再次阅读我的回答。 keepSynced 与持久性并没有真正的关系。 keepSynced 只是添加了一个侦听器,它像任何其他侦听器一样与客户端同步数据。应用进程被杀死后监听停止。持久性确定是否有任何同步数据(无论如何读取)保存在磁盘上以供将来使用,即使在应用进程被终止后也是如此。
    【解决方案2】:

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

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

    或者你也可以使用 Room(一个谷歌库)和 SQLite 来完成这个任务。 没有尝试过 Room,但我认为它会适合您的目的。 这是Room的官方文档

    【讨论】:

    • 是的,这也是一个解决方案,但我想知道当前数据库服务器是否存在解决方案,而不是创建本地数据库
    • @MohamedNagyMostafa 你找到解决办法了吗?
    猜你喜欢
    • 2017-04-03
    • 2019-06-11
    • 1970-01-01
    • 2021-03-30
    • 2022-09-06
    • 2020-04-22
    • 2017-05-24
    • 2018-12-29
    • 2017-01-12
    相关资源
    最近更新 更多