这不是一个完整的答案,但至少可以为您提供一些想法......
您提出的问题(以及您试图解决的问题)并非特定于 Google Gears,并且对于其他解决方案(如 HTML 5 或基于系统或 Flash/Air)仍然有效。
几个月前的上一次 ZendCon 上有一个关于这个主题的演讲——幻灯片可以在 slideshare 上找到:规划与浏览器本地数据库的同步
通过这些幻灯片,您会看到关于可能想到的几种可能性的注释(有些确实出现在您的脑海中,或者在其他答案中):
- 使用 GUID
- 复合键
- 主键池(即预先保留一系列键)
当然,对于其中的每一个,都有优点......也有缺点——我不会复制粘贴它们:看看幻灯片;-)
现在,在您的情况下,哪种解决方案是最好的?很难说,实际上 - 越早考虑同步,它可能会更好/更容易:当应用程序仍处于设计阶段时,将内容添加到应用程序中要简单得多^^
首先,确定是否:
- 您的应用程序通常已连接,并且很少发生断开连接
- 或者,如果您的应用程序通常断开连接,并且仅偶尔连接一次。
那么,你要同步什么?
- 数据 ?
- 就像“这是该用户发出的所有命令的列表”
- 当然,在每个断开连接的设备上复制这些数据——每个设备都可以修改它
- 在这种情况下,如果一个用户删除了一行,另一个用户添加了一行,如何知道哪一个拥有“真实”数据?
- 或者对这些数据采取的行动?
- 就像“我在该用户发出的命令列表中添加一个条目”
- 在这种情况下,如果一个用户删除了一行,而另一个用户添加了一行,那么同步很容易,因为您只需将这两个操作同步到您的中央数据库
- 但这并不容易实现,尤其是对于大型应用程序/系统:每次执行操作时,您都必须记录它!
还有一个我们通常不会想到的特定问题 - 直到它发生:特别是如果您的同步过程可能需要一些时间(如果您有很多数据,如果您不经常同步,...) ,如果同步还没有完成就停止了怎么办?
例如,如果:
- 火车上的用户可以使用一些 3G 卡访问网络
- 同步开始
- 有一条隧道 - 连接丢失。
在大多数情况下,拥有半同步数据可能不是那么好......
因此,您也必须找到解决该问题的方法:在大多数情况下,同步必须是原子的!