【问题标题】:How to sync flutter app's offline data with online database efficientlyFlutter App离线数据如何与在线数据库高效同步
【发布时间】:2020-01-12 21:05:03
【问题描述】:

假设我有一个待办事项应用程序,它在应用程序上线时将数据存储在 sqflite 数据库中(本地在手机上)我希望数据与我的在线数据库同步,比如 mongodb 或 firestore。我不想每次都进行完全覆盖或创建新表,我正在寻找一些仅更新数据库更改的有效解决方案。

【问题讨论】:

  • 这是一个架构问题。最好换个频道。
  • Firestore 已经支持离线模式。为什么有 2 个 DB?

标签: mongodb flutter dart sqflite


【解决方案1】:

我认为这将有助于构建离线和在线同步:

flutter_offline

http

sqlite

【讨论】:

  • flutter_offline 是否将数据存储为本地数据库?
  • 它会检测连接并相应地更改小部件。
【解决方案2】:

Firebase Cloud Firestore 为您完成这一切。如果您不能使用它,其他解决方案会复杂得多,因为同步信息可能非常棘手。

假设用户有 2 台设备,都保存相同的数据,服务器应该保留哪个版本,最新创建的数据,还是服务器首先收到的数据?

SQLite 对结构化数据很有用,但您可以使用系统偏好设置将数据保存为 JSON 字符串,然后将该 JSON 推送到服务器,如果可以这样做会简单得多。

同样,这确实不是一个简单的答案,并且因项目而异。

【讨论】:

    【解决方案3】:

    正如已经指出的,这是一个架构问题,可能没有简单的答案。这里有两个主要想法:

    场景 A :您只是在更新交易数据,顺序并不重要,例如移动考勤应用程序。用户的位置以及日期时间戳记录在服务器上。服务器负责其他所有工作(验证、处理、报告)。

    场景 B: 顺序很重要。如果您只是保持离线连接,那么旧数据可能会在以下情况下覆盖新数据:用户有两个设备。有新数据的设备先上线,再有旧数据的设备上线

    我已经处理了这两个场景,对于场景 B,我做了以下操作:

    1. 创建了一个“队列”表。
    2. 所有条目首先进入队列(在线或离线)
    3. 队列条目中的插入会触发 Firebase Cloud 功能。该函数进行验证和处理(示例如下)。
    4. 该函数在实际表中创建条目。

    第 3 步在使用 Todo 等应用程序时特别有用。这是因为您可能想要记录事件(例如在日志文件中),但如果稍后出现较旧的数据,则不更新待办事项状态。

    【讨论】:

    • 如何将数据以日期/时间戳保存在本地存储中,服务器根据时间戳排序存储数据?因此,即使用户拥有多个设备,数据也将始终按正确的顺序排列。
    • 使用本地存储并保持数据与服务器同步的方法不止一种。这取决于项目要求和数据设置。重要的问题是 - 你想花点时间编写所有代码、测试它还是使用谷歌(或类似的)经过验证的功能!
    • 由于相关成本,许多项目不想使用 Firebase/AppSync。我在 Digitalocean 上使用 Hasura GraphQL 和自定义节点服务器,它比 AWS 或 Firebase 便宜得多,但性能相同。
    猜你喜欢
    • 2016-05-12
    • 2017-01-06
    • 2020-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多