2010-03-21 3 views
20

Есть ли стандартный способ миграции схем базы данных на Android? Например, пользователь устанавливает более новую версию моего приложения для Android, но новая версия должна обновлять схему базы данных (и очистка базы данных пользователя и запуск уже не является вариантом!). Поэтому мне нужно запустить некоторые инструкции ALTER и/или скопировать таблицы при первой запуске моей новой версии.Как выполнить миграцию схемы базы данных в Android?

+0

Пожалуйста, объясните более подробно, что вы понимаете под миграцией схемы? Миграция где? – Pentium10

ответ

10

Да SQLiteOpenHelper поддерживает миграцию между различными версиями схем БД.

Обновление выполняется путем реализации

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

И Откат к предыдущей версии также поддерживается:

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

С немного мысли, вы можете почти автоматизировать многие из SQLiteOpenHelper методы. Взгляните на это сообщение в блоге http://www.greenmoonsoftware.com/2012/02/sqlite-schema-migration-in-android/

Обновление: у меня возникли проблемы, если для обновления базы данных требуется некоторое время. Взгляните на эту запись в блоге для реализации, которая работает для меня. http://www.greenmoonsoftware.com/2012/05/android-developer-how-to-safely-update-the-application-database/

0

Я знаю, что это старый, но я разработал плагин eclipse с открытым исходным кодом, который является языком, специфичным для домена (DSL, написанным с XText), который позволяет вам указать базу данных в виде списка миграций.

Он генерирует ваш ContentProvider, SqliteOpenHelper и контракт для вас в API, который похож на API, такой как API-интерфейс контактов или Media API.

Я написал базовое руководство, которое поможет вам начать работу здесь http://robotoworks.com/mechanoid-plugin/mechanoid-db/

До сих пор он поддерживает создание таблицы, создавать и изменять вид таблицы заявления, я надеюсь, что в полной мере реализовать SQLITE синтаксиса, где соответствующий для этого DSL.

Надеюсь, что это поможет и извините за спам! :)

0

Ответы yanchenko верны, однако вы можете взглянуть на Droid Migrate, что я написал, что широко использует SQLiteOpenHelper для облегчения автоматической миграции SQLite (так же, как это делает Rails).

+0

Исходя из фона рельсов, это выглядит потрясающе! Моя единственная забота заключается в том, что она все еще активно поддерживается? Последняя фиксация была около 2 лет назад. – aandis

1

Все приведенные выше ответы относительно SQLiteOpenHelper являются правильными, но все они содержат своего рода антипаттерн - создание/изменение структуры БД со строками. Это делает разработку и обслуживание более дорогостоящими. Иногда миграция состоит из многих утверждений, некоторые из них могут быть довольно большими. Написание их как строк, без какого-либо синтаксического контроля ... ну, для небольших структур это может сработать, но для некоторых более крупных это будет кошмар.

Лучшим способом управления изменениями схемы было бы сохранить каждый скрипт миграции во внешнем файле и заставить метод onUpgrade SQLiteOpenHelper выполнять их автоматически, в правильном порядке. Вот статья, посвященная этой теме: 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 не будет поддерживать Migrations (или другие активы) в Jar-файлах. Обходной путь, если Jar-проект находится в одном проекте Android Studio, заключается в том, чтобы добавить что-то подобное в gradle.build: sourceSets {main {assets.srcDirs = ['../library/src/main/resources/ " ]}} –

+0

@JohannesBrodwall Мы, безусловно, приветствуем запрос на перенос, чтобы улучшить это, если у вас есть лучшее решение, которое будет работать из коробки. –

+0

Я думаю, что единственным местом, где его можно улучшить, является документация. Он отлично работает, но мне понадобилось время, чтобы разобраться. Я не мог найти Android-документ на http://flywaydb.org/documentation/ –

1

Вы можете улучшить по умолчанию SQLiteOpenHelper с библиотекой Android-Migrator, которые позволяют применять миграции из sql файлов в андроиде assets папки.