public abstract class MigrationOpenHelper extends SQLiteOpenHelper {
private static final String DB_NAME = "app";
public MigrationOpenHelper(Context context, int version) {
super(context, DB_NAME, null, version);
}
/**
* すべてのマイグレーションコードをここに記述
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
if (oldVersion < 2) {
db.execSQL("alter table user add column updatedAt integer");
db.execSQL("update user set updatedAt = createdAt");
}
}
}
public class MigrationOpenHelperV1 extends MigrationOpenHelper {
public MigrationOpenHelperV1(Context context) {
super(context, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table user(_id integer primary key autoincrement, name text, createdAt integer)");
}
}
public class MigrationOpenHelperV2 extends MigrationOpenHelper {
public MigrationOpenHelperV2(Context context) {
super(context, 2);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table user(_id integer primary key autoincrement, name text, createdAt integer, updatedAt integer)");
}
}
/**
* 最新バージョンの {@link SQLiteOpenHelper} クラスを生成するファクトリクラス
*/
public class MigrationOpenHelperFactory {
protected MigrationOpenHelperFactory() {
}
public static SQLiteOpenHelper create(Context context) {
return new MigrationOpenHelperV2(context);
}
}
public class MigrationOpenHelperV1Test extends AndroidTestCase {
private Context context;
public void setUp() {
context = new RenamingDelegatingContext(getContext(), "test_");
SQLiteOpenHelper helperV1 = new MigrationOpenHelperV1(context);
try {
SQLiteDatabase db = helperV1.getWritableDatabase();
try {
// 初期データ
db.execSQL("insert into user(name, createdAt) values ('宮田', 1326361400)");
db.execSQL("insert into user(name, createdAt) values ('渡辺', 1326361400)");
db.execSQL("insert into user(name, createdAt) values ('吉澤', 1326361500)");
db.execSQL("insert into user(name, createdAt) values ('吉沢', 1326361600)");
} finally {
db.close();
}
} finally {
helperV1.close();
}
}
public void testV1toLatest() {
SQLiteOpenHelper helper = MigrationOpenHelperFactory.create(context);
try {
SQLiteDatabase db = helper.getWritableDatabase();
try {
UserDao userDao = new SQLiteUserDao(db);
List<User> users = userDao.findAll();
assertEquals("件数が変わっていないこと", 4, users.size());
assertEquals("ユーザーの順序が変わっていないこと", "宮田", users.get(0).getName());
assertEquals("ユーザーの順序が変わっていないこと", "渡辺", users.get(1).getName());
assertEquals("ユーザーの順序が変わっていないこと", "吉澤", users.get(2).getName());
assertEquals("ユーザーの順序が変わっていないこと", "吉沢", users.get(3).getName());
for (User user : users) {
assertEquals("更新日時が移行できていること", user.getCreatedAt(), user.getUpdatedAt());
}
} finally {
db.close();
}
} finally {
helper.close();
}
}
}