2010-03-21 72 views
20

在Android上有數據庫模式遷移的標準方式嗎?例如,用戶安裝我的Android應用的較新版本,但是新版本需要更新數據庫模式(並且擦除用戶的數據庫並且不能重新啓動!)。所以我需要在第一次運行新版本時運行一些ALTER語句和/或複製表。如何在Android中進行數據庫模式遷移?

+0

請詳細解釋在模式遷移下您瞭解什麼?遷移在哪裏? – Pentium10 2010-03-21 21:47:05

回答

10

是SQLiteOpenHelper有不同版本的數據庫模式的之間遷移的支持。

升級是通過實現

public abstract void onUpgrade (SQLiteDatabase db, int oldVersion, int newVersion) 

和回滾到以前的版本做的是還支持:

public abstract void onDowngrade (SQLiteDatabase db, int oldVersion, int newVersion) 
0

我知道這是一箇舊的,但我已經開發了一個開源的eclipse插件,它是一個領域特定的語言(使用XText編寫的DSL),允許您指定一個數據庫作爲遷移列表。

它產生的的ContentProvider,SqliteOpenHelper和合同爲你,爲類似於像聯繫人API或媒體API的API的API。

我寫了一個基本的指南,幫助你弄到這裏開始http://robotoworks.com/mechanoid-plugin/mechanoid-db/

它支持創建表,創建視圖和ALTER TABLE語句,希望全面落實SQLite的語法適合這個DSL地方。

希望對垃圾郵件有幫助和抱歉! :)

0

yanchenko的答案是正確的,但是,你可能想看看Droid Migrate,這是我寫的一個框架,它大量使用SQLiteOpenHelper來促進自動SQLite遷移(很像Rails的做法)。

+0

從軌道背景來看,這看起來很棒!我唯一擔心的是,它是否仍然積極維護?最後一次提交大約在2年前.. – aandis 2016-07-09 10:44:37

1

所有關於SQLiteOpenHelper以上的答案是正確的,但它們都包含了一種反模式 - 創建/修改數據庫結構的字符串。這使得開發和維護成本更高。有時候,遷移由許多陳述組成,其中一些可能相當大。把它們寫成字符串,沒有任何語法的意義......好吧,對於小型結構來說它可能工作,但對於一些更大的結構它可能是一場噩夢。

一個更好的辦法來管理模式的變化將是保持每個遷移腳本在外部文件,並進行SQLiteOpenHelper的onUpgrade方法自動執行它們,以正確的順序。這裏有一篇關於這個主題的文章:http://www.vertabelo.com/blog/sqlite-on-android-handling-database-structure-changes。我希望這有幫助。

5

從版本3.0開始Flyway現在支持Android上的數據庫遷移。它可以與SQLite一起使用,但也可以與任何其他希望使用的數據庫(本地內存中的一個或服務器上的一個數據庫用於雙層應用程序)一起使用。

遷移可以寫成兩個SQL和Java。

+0

我發現Flyway在Android上找到遷移有點棘手。遷移必須位於資產文件夾中,該文件夾並不是默認使用新的Android Studio項目創建的。此外,Android不會支持Jar文件中的遷移(或其他資產)。 我的解決方法是,如果Jar-project在同一個Android Studio項目中,在gradle.build中放置類似這樣的東西:sourceSets {main {assets.srcDirs = ['../library/src/main/resources/' ]}} – 2016-02-14 12:24:05

+0

@JohannesBrodwall如果你有一個更好的解決方案,可以開箱即用,我們當然會歡迎提出改進的請求。 – 2016-02-14 13:00:08

+0

我認爲唯一可以改進的地方是文檔。它工作正常,但我花了一段時間才弄清楚。我無法在http://flywaydb.org/documentation/ – 2016-02-14 13:06:30

1

您可以使用庫Android-Migrator增強默認SQLiteOpenHelper,允許您在android assets文件夾中應用從sql文件遷移。