搜尋

首頁  >  問答  >  主體

android - 类似Evernote多客户端与服务器同步数据的最佳方案?

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

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

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

黄舟黄舟2773 天前694

全部回覆(4)我來回復

  • PHP中文网

    PHP中文网2017-04-17 11:41:52

    刪除的邏輯有問題

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

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

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

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

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

    回覆
    0
  • PHP中文网

    PHP中文网2017-04-17 11:41:52

    請看 知乎上的回答

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

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

    回覆
    0
  • 天蓬老师

    天蓬老师2017-04-17 11:41:52

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

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

    回覆
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-17 11:41:52

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

    回覆
    0
  • 取消回覆