【问题标题】:Data entered offline does not synchronize when going back online离线输入的数据在重新在线时不同步
【发布时间】:2017-12-04 20:07:30
【问题描述】:

一些用户报告说他们创建了离线内容,但当他们上网时会丢失数据。它们就这样消失了。

我不知道从哪里开始,在我的测试中没有发生这种情况。

是否存在身份验证问题?我今天使用电子邮件和密码的形式。

我正在使用 minSdkVersion 16 并编译 'com.google.firebase: firebase-auth: 10.2.1'

我提到了身份验证,为什么不清楚当用户失去身份验证时 firebase 的行为。我们假设它失去了身份验证并插入了新数据(在失去身份验证之后),firebase 是做什么的?

1 - 阻止插入 - 如果是这种行为,我的问题不会是拧紧,因为数据已插入,我可以在 APP 中看到它。

2 - 不阻止插入,但是当它在线时,这些数据会丢失(这是我的怀疑)

3 - 不阻止插入,将插入放入队列并更新基础(这是我希望的,因为如果用户由于意外原因失去离线身份验证,我将不必再次进行身份验证,直到它消失在线)。

【问题讨论】:

    标签: android firebase firebase-realtime-database firebase-authentication


    【解决方案1】:

    应用程序下线,进入后台,最终被Android杀死以节省资源是正常的。如果您想在应用程序离线并随后被杀死时保留任何写入的数据,您应该enable persistence,默认情况下是关闭的:

    FirebaseDatabase.getInstance().setPersistenceEnabled(true);
    

    应用再次启动上线时会同步写入的数据。

    离线时不支持交易。

    【讨论】:

    • 感谢您的回复,但是离线模式已经启用,很遗憾这不是解决方案。它并不总是发生,它是随机的。
    • 如果离线同步存在错误,您应该提交包含特定重现详细信息的错误报告。持久性和同步与身份验证无关。
    • 脱机保存骰子没有错误,脱机没问题,插入成功后显示。问题是上网有些。我试图模拟这个问题,但正如我所说,它是随机的。我编辑并把唐尼放在了 Auth 上。
    【解决方案2】:

    来自 Firebase 文档 docs,它说:

    应用离线时执行的任何交易都是 排队。一旦应用程序重新获得网络连接,交易 发送到实时数据库服务器。

    但随后 Firebase 立即发出警告:

    即使启用了持久性,事务也不会持久化 应用程序重新启动。所以你不能依赖离线完成的交易 致力于您的 Firebase 实时数据库。为用户提供最好的 经验,您的应用程序应该显示交易尚未保存 进入您的 Firebase 实时数据库,或者确保您的应用 手动记住它们并在应用重启后再次执行它们。

    现在我不太确定您的用户正在经历的确切情况,但我确实有一些关于如何处理此问题的建议。

    首先,由于在设备离线并且应用程序进入后台时事务被持久化的可能性非常低,因此您最好在允许用户更新您的应用程序之前检查网络连接。这当然是一个简单的方法,但它确实有效。

    此外,您可以按照 Firebase 的建议,在每次上传时附加一个监听器,并将离线内容标记为“x”(诚然不是一个好的选择)或在您的 UI 中指示内容尚未上传的标记。类似于显示在尚未发送的消息上的 WhatsApp 时钟图标。然后,当您的应用恢复或重新启动时,让它检查所有未发送的内容并重新上传。

    第三,就像第二种情况一样,您可以在该内容上添加一条错误消息,但这次告诉您的用户在重新启动时重新发送它们。

    我基本上只是总结了文档所说的所有内容,但至少这应该让你走上解决这个问题的正确道路。

    【讨论】:

    • 这太可怕了。然后,Firebase 在宣传时没有离线支持,因为它是部分的。它的第一个建议对企业来说是不切实际的,并不是每个地方都可以随时访问网络。如果 Firebase 向我提供了每个更改数据的状态/或不向我提供状态,则第 2 种替代方法将起作用。第 3 种替代方法将不得不惩罚我的用户,让他重复执行某项操作。我非常失望!这么长时间开发我的应用程序基于一个无法解决的解决方案,它只能完全在线运行。
    • 从来没有打算把火力画得很糟糕。它非常有效,因为离线支持在离线查看数据甚至离线上传数据时都非常有用。当离线应用处于后台时,更多的是 android 破坏了任务。
    • 我不认为这是一个android问题,因为在APP文件夹中它不会在空间不足的极端情况下混乱。我说的是几个小时内无法访问。 Firebase 应阻止离线插入或确保将插入数据。至少,Firebase 应该让开发人员更清楚这一点,也许是一种查看尚未同步的内容的方法。
    【解决方案3】:
    FirebaseDatabase.getInstance().setPersistenceEnabled(true);
    

    试试 - Enabling Offline Capabilities on Android

    【讨论】:

    • 你可以试试这个离线缓存 - snappydb.com 并制作一个包装类,它将在离线期间检查和插入数据
    • 感谢您的提示,但这不是重点。我想确定 Firebase 发生了什么,假装理解并采取行动(这可能是您通过的这个提示)。
    猜你喜欢
    • 2010-09-21
    • 2011-09-10
    • 1970-01-01
    • 2011-12-05
    • 1970-01-01
    • 2021-11-30
    • 1970-01-01
    • 2020-01-27
    • 1970-01-01
    相关资源
    最近更新 更多