2010-03-21 70 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文件迁移。