Writing Migrations

A Migration itself has only one required method: migrate(). You are given a SupportSQLiteDatabase, from the support database API covered in the preceding chapter. You can use the SupportSQLiteDatabase to execute whatever SQL statements you need to change the database schema to what you need.

The Migration constructor takes two parameters: the old schema version number and the new schema version number. You will only ever need one instance of a Migration for a given schema version pair, and usually the migrate() implementation for that schema version pair will be unique. Hence, the typical pattern is to implement each Migration as a Kotlin object, where you can provide the migrate() function to use for migrating the schema between that particular pair of schema versions.

To determine what needs to be done, you need to examine that schema JSON and determine what is different between the old and the new. Someday, we may get some tools to help with this. For now, you are largely stuck “eyeballing” the SQL. You can then craft the ALTER TABLE or other statements necessary to change the schema, much as you might have done in onUpgrade() of a SQLiteOpenHelper.

For example, the Migration module of the book’s primary sample project has a NoteDatabase akin to the NoteBasics module that we saw earlier in the book. One difference is that we have a MIGRATION_1_2 object that implements a Migration:

internal val MIGRATION_1_2 = object : Migration(1, 2) {
  override fun migrate(db: SupportSQLiteDatabase) {
    db.execSQL("ALTER TABLE notes ADD COLUMN andNowForSomethingCompletelyDifferent TEXT")

Our migrate() function executes an ALTER TABLE statement, using execSQL() on the supplied SupportSQLiteDatabase object. The MIGRATION_1_2 object supplies 1 and 2 as the schema version pair to the Migration constructor, to identify what version pair this migrate() will handle.

Prev Table of Contents Next

This book is licensed under the Creative Commons Attribution-ShareAlike 4.0 International license.