如何高效地将flutter应用的离线数据与在线数据库同步

mah*_*mnj 15 mongodb dart flutter sqflite

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

mFe*_*ein 10

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

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

SQLite 适用于结构化数据,但您可以使用系统首选项将数据保存为 JSON 字符串,然后将该 JSON 推送到服务器,如果可以这样做,它会简单得多。

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


小智 5

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

颤振_离线

http

sqlite


Suk*_*khi 5

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

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

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

我处理了这两种情况,对于情况 B,我执行了以下操作:

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

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

  • 由于相关成本,许多项目不想使用 Firebase/AppSync。我在 Digitalocean 上使用 Hasura GraphQL 和自定义节点服务器,这比具有同等性能的 AWS 或 Firebase 便宜得多。 (2认同)