2009-06-22 189 views
7

我已經創建了一個應用程序在xcode與sqlite3.I想創建一個名爲同步的按鈕來與我的服務器中的MySQL數據庫同步。任何有關同步過程的建議?請告訴我。同步SQLite客戶端數據庫與MySQL服務器數據庫

+0

你是否願意同步創建表的下落? – Macarse 2009-06-22 07:04:46

+0

是的...這意味着我想與服務器同步,每當我需要它...通過無線交易不連接iPhone到PC – user123589 2009-06-22 10:30:53

回答

4

使用服務器上的web服務返回模式版本號和上次更新的時間戳。如果客戶端已過期,則會進行第二次調用以獲取更新的模式和/或新數據。

3

我相信你是說你在一臺計算機上運行MySql服務器,並且你正在運行一個帶有sqlite實例的應用程序,並且如果MySql服務器上有新數據,你想更新sqlite服務器。

我會做這樣

1)確保你的計算機上,並在應用程序中的表具有相同的結構。包括最後一次更新的字段

2)要檢查誰是最新的,請通過您的唯一密鑰獲取最後一行,然後比較更新的字段。

3)當最新的字段屬於服務器,然後找出有多少行是不同的,並開始複製它們在do ... while()循環或不管你喜歡。

如果您在服務器和客戶端上都實現此代碼,那麼他們可以互相更新,或者您更喜歡只更新客戶端。

細節取決於您要使用的語言以及您希望投入開發的時間。

0

幾個問題:

  • 您是否試圖雙向同步,或從服務器只需拔更新?
  • 哪些更新操作可以接受?插入/更新/刪除?在複製數據庫中,通常會避免刪除。

如果您只需要從服務器拉取插入/更新,您可以創建一個PHP腳本,它將返回要執行的SQLite語句。 php腳本將從客戶端獲取最後更新序列/時間的參數。

如果你打算做雙向同步,那麼你必須考慮合併和衝突解決。對於雙方來說,最好是每一方都有一個事務隊列。只需記錄針對數據庫執行的每條CRUD語句。同步時,應用這些語句,然後截斷隊列。

8

你意識到這是一個不平凡的問題。我去年爲一個商業應用程序編寫了一個庫來完成這個工作,花了大約6個月的時間才把它帶到了我對它感到滿意的地方。

撇開使用端口80和HTTP(TCP/IP)以避免防火牆和支持問題的爭論,您需要設計一個協議。由於我的項目是非常數據敏感,我去了一個二進制協議(而不是臃腫的XML),可以處理任何數據。我也希望它是雙向的,以便我可以插入數據以及執行請求。我在服務器上使用了CGI/FastCGI。

我設計的二進制協議非常簡單(總是更好),並將大量傳輸分成用戶定義大小的塊(大約600k似乎很好)。每個塊都有一個標題,後跟數據。

雖然此協議可用於傳輸任何類型的數據,但通常用於數據庫樣式數據,正如您的問題所暗示的那樣。爲了證明這一點,我決定使用行/列的方法來設計。數據一次存儲一行,這意味着每個列存儲第一行,然後存儲第二行...第n行的所有列。

單個列中的數據的格式是:

' Col1Type   1Bytes - BYTE  ' Data Type (REMSQL_TEXT etc)     
' Col1Len   4Bytes - DWORD ' Length in bytes the Column Data       - up to 4.2GB 
' Col1Data   nBytes - BYTE  ' String data 

(在C,一個字節是CHAR)

這意味着,每列具有數據類型描述符。

REMSQL_NONE = 0 ' DataType undefined 
REMSQL_QUAD = 1 ' 64-bit signed integer     
REMSQL_DBLE = 2 ' 64-bit IEEE floating point number 
REMSQL_TEXT = 3 ' STRING - (CHAR) string of Ascii Bytes          
REMSQL_BLOB = 4 ' BLOB - (CHAR) string of Binary Bytes          
REMSQL_NULL = 5 ' NULL - Empty Column 

這些數據類型共前前後後使用SQLite基本數據類型和在數值上等同於SQL3基本數據類型枚舉:所有的數據類型可以用來表示。

在這個設計中,如果一個字段爲空(NULL),那麼你只需要5個字節來存儲它。例如,如果一個字段有200個字節的文本,則只需要205個字節來存儲它。更大的好處是解析數據,因爲跳過列可以在不讀取所有200個字節的情況下完成,找到一些終止字符。

Chunk標題應該包含諸如行數,列數,總字節數等等等等。如果使用DWORD(無符號64位整數),那麼塊的理論限制是4.2gig,它應該足以滿足本地網絡傳輸。

該實現需要爲此功能編寫SQLite/MYSQL包裝器。我只使用BINARY協議,這需要一點時間,但您基本上需要以下功能: 客戶端:SendRequest() - 發送請求,等待響應

服務器端:ProcessRequest() - 接收請求,進程它並返回響應

在我的情況下,響應可以是!00MB或更多的數據。我從MySQL檢索整個數據集並將其保存到服務器上的磁盤中。然後我返回一個包含數據集指標的空白塊。然後,客戶端逐個請求以600k爲單位的數據集。如果連接丟失,它只會從停止的地方開始。

最後,數據集主要是文本(名稱地址等),以便壓縮。在這種情況下,安全性是一個非常大的問題,所以加密非常重要這確實會稍微複雜一些,但基本上你會壓縮整個塊,填充到塊密碼BLOCKSIZE的倍數並對其進行加密。

在這一切的過程中,我寫一個非常快的字符串生成器類,在ASM AES加密的實現,整個FastCGI的庫(www.coastrd.com)

所以,正如我說的,不平凡。我將很快提供這個圖書館。如果你想看看,給我發電子郵件。

一旦你寫好通訊,你就可以開始設計同步。我要麼爲每個記錄使用散列,要麼使用簡單的布爾標誌。如果服務器上有任何更改,只需發送整個記錄並在客戶端覆蓋它(假設您正在嘗試使客戶端保持同步...)

如果您自己編寫,請在此發佈有關您的體驗!

PS。考慮更改標題,以更友好的搜索..也許是這樣的:

(使用Hibernate在Java中)

0

SQuirreL SQL「與MySQL服務器數據庫同步一個SQLite客戶端數據庫」擁有DBCOPY插件它。可以使用它編寫數據庫副本。我沒有嘗試過,但那是我要走的第一個方向。

相關問題