android - 类似Evernote多客户端与服务器同步数据的最佳方案?
黄舟
黄舟 2017-04-17 11:39:52
0
4
691

这里说的同步是:
手机App内有一个sqlite的数据库,以便他离线时可以增加一些数据,例如拍的照片以及写的文字等.
当联网时,自动把离线时写的东西提交给服务器
同时,如果用其他客户端改变的旧内容或删除了旧文章,那么在App里也做出对应的修改和删除,保证本地App与服务器始终是一模一样的

目前采取的方案是按最后修改时间来做处理,如果ID相同的项目,始终以修改时间最新的那个作为标准,
如果App本地数据库出现有服务器不存在的项目,那么就把本地的删除.

可有其他更优的方案实现类似Evernote的多客户端同步?

黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

全部回覆(4)
Ty80

刪除的邏輯有問題

如果本地創建了新項目,伺服器是肯定沒有的,而本地的就被刪除了。

當一個項目被刪除時,資料庫內仍然應該留有【ID=xx被刪除】的刪除記錄;只要沒有這個刪除記錄,就是新增的記錄。若干天後可以清理舊的刪除記錄;天數取決於你認為多久所有客戶端都會同步一次。

多個客戶端在離線狀態下改變了同一個檔案可能造成衝突

Dropbox的處理方法是複製出一個conflict copy檔案。 我還是偏好覆蓋為最新版本,並在伺服器保留歷史版本若干天。

不過,要判斷誰是【最新版本】並不容易。在網路上,你不能保證時鐘是同步的。時區的問題容易解決,使用UTC就行。即使如此,UTC絕對時間也無法保證精確。

Ty80

請看 知乎上的回答

http://www.zhihu.com/question/20238731

作者 Wayde Tse http://www.zhihu.com/people/waydetse

Peter_Zhu

自己沒有動手試過,但是也許可以試試類似Git的同步方式? commit和update分開。 伺服器端記錄所有的更新/提交信息,客戶端記錄從上一次的同步時間(如果有的話)後最終的修改記錄(添加/刪除應該是一樣的),然後客戶端把修改記錄發給伺服器(同一帳戶的多客戶端可以透過訊息佇列的方式排隊進行更新),當然,只有最後一個commit後發送更新請求的客戶端能獲得全部更新

當然,遺留問題就是指向同一個檔案的不同修改造成的衝突的問題,沒想好該怎麼處理……要不和git一樣提醒用戶自己手動解決?

伊谢尔伦

要判斷誰是【最新版本】並不容易。在網路上,你不能保證時鐘是同步的。
目前我改成所有更新到伺服器的數據,都用伺服器時間來更新時間戳,然後將該時間傳回給客戶端,客戶端修改自己資料的時間跟伺服器上一樣

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板