我正在开发一个移动应用程序,但我不知道该怎么做。我将在 iPhone 上使用 Appcelerator Titanium。
每当用户手机上的本地 SQLite 数据库发生变化时,我不希望用户调用在线数据库。
我想这样做,以便用户可以离线工作。
稍后,当用户按下按钮时,我希望将所有更改复制到在线数据库(仅更改已更改的内容)。
我不知道最好的方法是什么。
一种明显的方法是,每次同步时,我都会将整个数据库从手机复制到网络服务器。但不知何故,这似乎不合逻辑,也许不合逻辑。
寻找建议。
我正在开发一个移动应用程序,但我不知道该怎么做。我将在 iPhone 上使用 Appcelerator Titanium。
每当用户手机上的本地 SQLite 数据库发生变化时,我不希望用户调用在线数据库。
我想这样做,以便用户可以离线工作。
稍后,当用户按下按钮时,我希望将所有更改复制到在线数据库(仅更改已更改的内容)。
我不知道最好的方法是什么。
一种明显的方法是,每次同步时,我都会将整个数据库从手机复制到网络服务器。但不知何故,这似乎不合逻辑,也许不合逻辑。
寻找建议。
在数据库中使用“最后更新”列。
保留一个“同步”事件表,记录每个同步事件的时间戳。
同步时,过滤自“上次同步”以来更改的行。
我将构建我的数据库,以便每条记录都有一个 UUID - 这样您就可以将本地数据库行与服务器上的镜像行进行匹配。
希望这能给你一些想法。
在比较的时候,你也可以采取行动。这里建议的“最后更新”列是最常见的方法:最新记录(通过时间戳标识)胜过旧记录。
但有时,同一记录可以同时在源和目标上更改。你做什么工作?
1-您可以检查每条记录的列并仅更改另一条中未修改的已修改值
ex: (changes are marked *)
Mobile side:
Last: Doe
First: Jogn
*Age: 58
Timestamp: 2020-10-10 20:00:00
Server side:
Last: Doe
*First: John
Age: 56
Timestamp: 2020-10-10 20:00:00
That would merge data and change only John and the age to 58
Last: Doe
First: John
Age: 58
Timestamp: 2020-10-10 20:00:00
2- 现在,如果您同时更改同一列会怎样(相信我,它会发生,例如在数据采集系统中)
ex: (changes are marked *)
Mobile side:
Last: Doe
*First: John
Age: 58
Timestamp: 2020-10-10 20:00:00
Server side:
Last: Doe
*First: Henry
Age: 58
Timestamp: 2020-10-10 20:00:00
此信息正在发生冲突。如果您的应用程序是交互式的,您可以为用户提供一种方法来实际选择 John 或 Henry 哪个值获胜并成为参考。
但是现在如果你有数百次碰撞,你的用户就会放弃。您可以提供“左”总是赢,或“右”总是赢。至少用户决定并负责数据完整性。
如果您的应用程序自动处理数据,那么您必须实施一种机制来让一方胜过另一方。这可能是一场噩梦。
Interbase 数据库具有非常好的更改视图。其他数据库也有机制。但它们都是有代价的,它们不像 SQLite 那样免费。
请记住,大多数处理更改的模型或开发工具通常假定具有最新时间戳的记录胜过旧的记录。可能满足 95% 的需求。