2011-09-08 20 views
10

我剛剛做了一個快速搜索,沒有什麼太相關的東西出現在這裏。iOS推出應用更新。需要更新數據庫時保持用戶數據不變

我已經發布了應用程序的第一個版本。自那時以來,我對SQLite數據庫進行了一些更改,在下一個版本中,我將需要更新數據庫結構,但保留用戶的數據。

這是最好的方法是什麼?我目前認爲,在應用程序更新中,我絕不會替換用戶的(文檔文件夾,不是包)數據庫文件,而是使用SQL查詢來更改其結構。

這將涉及跟蹤自上一版本以來對數據庫所做的更改。將所有這些更改編寫到SQL查詢中並運行這些更改以使數據庫達到最新版本。我還需要在數據庫中保留一個字段來跟蹤版本號(爲了簡單起見,與應用版本保持一致)。

除非有特定的鉤子,更新後第一次運行的委託方法會在運行之前將此邏輯的調用放到appDelegate的開頭。

雖然這樣做,我會顯示「更新應用程序」或用戶的東西。

接下來的事情,如果沿線的某處出現錯誤並且更新失敗,會發生什麼情況。該數據庫將過時,應用程序將無法正常工作,因爲它期望更新的版本?

我是否應該自己去刪除用戶的數據庫文件,並將其替換爲應用程序包中的新版本。或者,我應該只是測試,測試,測試,直到所有事情都穩定在我身邊,並且如果在用戶方面出現錯誤,則是另一回事,在這種情況下,我無能爲力,只會丟棄數據。

對此的任何想法將不勝感激。 :)

謝謝!

+2

在應用程序啓動時更改數據庫結構應該沒問題。只要確保這樣做是正確的,並保持用戶在這段時間內不與應用程序交互(應該不會太長)。正如您之前所說的,將版本號保留在默認值中,並在啓動時比較版本號。 – tilo

+0

[AT] John Topley,感謝您的拼寫更正。傻我。 ;) @Tilo這就是我現在正在做的,這似乎是一個很好的方法。謝謝。 :) – conor

回答

5

首先,您正在考慮的方法是正確的。這被稱爲數據庫遷移。無論您何時修改數據庫,都應該將適當的ALTER TABLE...等方法收集到遷移腳本中。

然後下一個版本的應用程序應該運行一次這個代碼(如您所描述的)來遷移所有用戶的數據。

至於處理錯誤,這是一個艱難的。我會非常厭倦丟棄用戶的數據。更好的辦法是顯示錯誤消息,並讓用戶通過錯誤報告與您聯繫。然後,您可以發佈更新到您的應用程序,希望可以進行沒有問題的遷移。但理想情況下,您對這個過程進行了足夠好的測試,以避免出現像這樣的問題。當然,這一切都取決於移植過程的複雜性。

+0

聽起來不錯,當你說收集適當的ALTER TABLE ...等你是否保存我的SQLite應用程序生成的副本,因爲我正在進行更改?好主意。 謝謝。 – conor

+1

是的,如果您正在使用應用程序更改數據庫,請複製其生成的命令。我個人將有一堆從MyDB_v1.sql開始的.sql文件,它有最初的CREATE語句,然後在我開始更改東西時立即創建MyDB_migrate_v1_to_v2.sql。這包含任何修改數據庫的命令。發佈之後,我將創建MyDB_migrate_v2_to_v3.sql並使用它來保留進一步的遷移等。 –

+0

好的,還有一件事。我沒有跟蹤自最初發布以來的任何更改,因爲該應用程序目前不存儲用戶數據。我可以覆蓋數據庫沒有問題,只有一個例外。 該應用程序將書籍/章節下載到數據庫。鑑於4.3.3中的無線網絡錯誤,這需要相當長一段時間。我不知道是否有一種方法可以替換用戶端的實際數據庫文件,同時將下載的書籍轉移到新的數據庫中? – conor