2012-02-29 150 views
6

我們有一個android應用程序和一個iPhone應用程序(相同的功能),使用sqlite本地數據存儲。應用程序最初沒有數據,然後在第一次運行時,它們從遠程服務器接收數據並將其存儲在sqlite數據庫中。 sqlite數據庫由服務器創建,應用程序將其作爲一個文件下載,然後用於購買應用程序。按照今天的標準,數據庫文件不是很大,但也不是很小 - 大約5-6 MB。同步/更新sqlite數據庫

現在,有一段時間,應用程序需要刷新服務器中的數據。有幾種方法可以考慮:

  1. 從服務器下載新的完整數據庫並替換現有的數據庫。這聽起來像是處理這個問題最簡單的方法,不是因爲重複5-6 MB的下載。這些應用程序確實會提示用戶是否要下載更新,因此這可能不是太大問題。

  2. 從服務器上下載增量數據庫,其中只包含新的/修改的記錄,並以某種形式提供有關要刪除哪些記錄的信息。這將導致更小的下載量,但客戶端的工作更復雜。我需要讀取一個數據庫,並根據讀取的內容更新另一個數據庫。據我所知,沒有辦法用sqlite來做類似insert into db1.table1 (select * from db2.table1)的地方,其中db1db2是兩個包含結構相同的table1的sqlite數據庫。 (完整的sqlite數據庫包含大約10個表,最大的可能包含約500個記錄左右)。

  3. 下載某些其他格式(json,xml等)中的數據增量並使用此信息更新應用程序中的數據庫。與以前一樣:在服務器端沒有太多問題,比完整的數據庫更小的下載大小,但是執行更新是一個非常痛苦的過程。

您推薦三種方法中的哪一種?或者,也許還有另一種我錯過的方式?

非常感謝提前。

+0

https://stackoverflow.com/questions/4008015/android-sqlite-bidirectional-synchronization-sqlite – 2017-07-01 03:39:52

回答

1

經過很多考慮和嘗試錯誤,我去了選項(2)和(3)的組合。

  1. 如果沒有數據存在的話,那麼該應用程序從服務器下載完整的數據庫文件。

  2. 如果數據存在並且需要更新,應用程序會從服務器下載一些數據庫。並檢查特定表中特定值的內容。該值將說明新數據庫是否替換原有的或是否包含刪除/更新/插入

這原來是最快的方式(性能明智),並留下所有繁重的任務(確定是否將所有內容放入一個數據庫或只是更新)到服務器。此外,通過這種方法,如果我需要修改算法,比如說總是下載完整的數據庫,那麼只需要在服務器上進行更改,而無需重新編譯和重新分發應用程序。

+0

你可以發佈任何樣本或教程嗎? – 2012-12-07 02:59:43

+0

我還想看到一些示例 - 我試圖同步sqlite數據庫 - 存儲在Google Drive上的一箇中央數據庫以及存儲在各個Android設備(可能不總是可以訪問互聯網)上的任意數量的脫機數據庫。 – Rohaq 2013-03-10 20:45:48

+0

@Rohaq如果設備無法訪問互聯網,則無法同步任何內容。就我而言,同步始終是一種方式 - 從服務器到設備 - 數據庫的結構不會改變,只有數據。 – 2013-03-11 09:04:28

-1

我會推薦方法3,因爲應用程序會更快地下載json文件,並且更容易更新本地數據庫,避免更多互聯網使用的開銷。

最初只是創建一個空的數據庫,根據服務器的數據庫,然後通過獲取JSON定期更新一樣

+2

我不確定你的「更快地下載json文件」的措辭。我做了一些測試/原型設計:當完整的數據庫大小約爲5 MB時,包含所有數據的json文件大約爲8 MB。除了大小的1.5倍之外,解析這樣一個巨大的json也可能非常耗時。 – 2012-02-29 13:24:02

+0

json將以字段名和值的形式包含各個表的所有記錄。另外,每個表將會有多個json,這些json將分開提取。 – Maneesh 2012-02-29 13:29:25

+1

好的,在這種情況下,我看不出從服務器下載完整的數據庫效率如何。 – 2012-02-29 13:33:58

0

有沒有一種方法,你可以爲每個表的JSON場?例如,如果你有一個名爲users的表,那麼有一個名爲「json」的列來存儲每個用戶的JSON。實質上,它將包含其餘字段所具有的信息。

因此,當您以JSON下載增量時,您所要做的就是將JSON插入到表中。

當然,使用這種方法,您需要額外的工作來解析JSON並從中創建模型/對象,但它只是一個額外的3-4個小步驟。

+0

這並不像聽起來那麼簡單。數據庫中的表與外鍵鏈接,因此一個表中的數據本身沒有意義,沒有其他表中的數據。數據真的需要全部在一起。當我查詢數據時,我使用連接來獲取所需的信息。 – 2012-02-29 15:31:56