2010-06-02 89 views
7

我有一個核心數據應用程序,最終成爲iPhone/iPad通用應用程序。iPad/iPhone應用程序之間的雲同步

我想實現雲同步,使得iPhone和iPad的都運行該應用程序可以共享數據。我打算使用recently released Dropbox API。有沒有人有關於這樣做的最佳方式的任何想法? Dropbox API允許應用程序在雲上存儲文件。我在想的是在雲上原始存儲應用程序的數據庫(sqlite),然後下載該數據庫,但後來我意識到使用該方法會使合併更改(而不是替換整個數據庫)變得非常困難。

任何想法表示讚賞。謝謝。

回答

5

如果你能擺脫它,做同步(迄今爲止)最簡單的方法是有本地數據的副本:您上次上傳(「舊」)的複印件,由局部變化所產生的副本(「雷」)及複印件現在從服務器(「他們」)下載。

然後,排序都在所有三個文件的記錄,並穿行逐一:

  • 如果老雷==,使用他們的
  • 否則,如果老==他們的,用我的
  • 否則你有衝突;做一些關於它的事情(例如,總是使用我的,也就是「最後作家獲勝」)

請注意,「我的」或「他們的」或「舊的」可能不存在。上述規則在這種情況下仍然適用;如果您選擇的結果是「不存在」,那麼您將希望刪除輸出文件中的記錄。

最後,上傳生成的文件返回到服務器,這樣它會爲未來的傢伙了「他們」的數據庫。然後將新文件複製到本地「舊」和「我的」數據庫。

(有更多的空間,高效的算法比上面......但目前還沒有任何容易的人:)和磁盤空間是相當便宜的今天,特別是如果你把文件壓縮。)

+0

有沒有什麼收穫? – Yoo 2011-01-23 06:32:18

+0

總是有一個問題:) – apenwarr 2011-02-03 10:55:11

0

你可能會考慮GameKit共享數據。否則,你似乎只需要管理與中間文件服務器的同步。

+0

我正在考慮該選項,但在兩個Core Data數據庫之間合併更改最簡單的方法是什麼? – indragie 2010-06-02 23:54:15

+0

iPhone不支持OS X提供的同步服務(http://developer.apple。com/iphone/library/technotes/tn2009/tn2152.html#SECSYNCING),所以你需要編寫自己的例程。考慮在記錄中添加時間戳,並允許用戶決定同步如何進行的策略(例如,將最新的時間戳記錄發送到所有其他設備)。 – 2010-06-03 10:37:12

1

您可能想要使用不同的方法進行同步。你將要處理的是什麼類型的數據?

我已經使用輕量級軌道後端很成功。

+0

只是一些簡單的模型對象(基本上由NSStrings,NSArrays等組成) – indragie 2010-06-02 23:57:12

+2

如果您對rails感到滿意,請查看ObjectiveResource項目。 – 2010-06-03 00:27:17

+0

我很遺憾,我只有一個贊成弗蘭克施密特的評論。 – corprew 2010-06-09 21:34:25

0

您可能想要將數據導出爲本地sqlite格式以外的格式。如果我正在設計這樣的東西,我認爲JSON可能是我的選擇格式。

我沒有看過Dropbox的API,但他們支持上傳和下載文件的差異,而不是整個文件,對不對?根據API是如何工作的,也許有你的應用程序瞭解他們的「差異」的格式,並與可能是更容易的工作...

+0

將數據轉換爲JSON不會成爲問題。我還有的問題是如何有效地合併兩個庫之間的更改。 – indragie 2010-06-03 00:06:11

+0

不幸的是,同步通常是一個難題。如果你想在兩個方向上同步,你需要爲每條記錄保留一些修改計數,並在合併時採用「最新」版本。真正的挑戰來自合理的處理衝突。 – 2010-06-03 16:44:20

+0

這就是我所想的,我需要找出解決衝突的方法。我想到的一個特定場景是,如果設備A有一條記錄,但後來被刪除,設備B有該記錄但未被刪除,我不希望設備A在同步時獲取該記錄。很難 – indragie 2010-06-05 17:34:21