ORMLiteにはデータベーススキーマを更新するため素敵な機能にonUpgradeメソッドがあります。このメソッド内でマイグレーションを実装します。SQLで。
前回のエントリーで実装したコードを修正していきます。
Account.java
package com.luckyandhappy.models;
import com.j256.ormlite.field.DatabaseField;
import com.j256.ormlite.table.DatabaseTable;
@DatabaseTable(tableName = "accounts")
public class Account {
@DatabaseField(generatedId = true)
private Integer id;
@DatabaseField
private String name;
@DatabaseField(canBeNull = true)
private String mail;
// 年齢フィールドを追加
@DatabaseField(canBeNull = true)
private Integer age;
public Account() {}
public Account(String name) {
this.name = name;
}
public Account(String name, String mail) {
this.name = name; this.mail = mail;
}
public Integer getId() { return this.id; }
public String getName() { return this.name; }
public void setName(String name) { this.name = name; }
public String getMail() { return this.mail; }
public void setMail(String mail) { this.mail = mail; }
public Integer getAge() { return this.age; }
public void setAge(Integer age) { this.age = age; }
}
DatabaseHelper.javaをデータベースのバージョンを修正し、onUpgradeメソッドを実装します。
DatabaseHelper.java
package com.luckyandhappy.models;
import java.sql.SQLException;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.os.Environment;
import android.util.Log;
import com.j256.ormlite.android.apptools.OrmLiteSqliteOpenHelper;
import com.j256.ormlite.dao.Dao;
import com.j256.ormlite.support.ConnectionSource;
import com.j256.ormlite.table.TableUtils;
public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
private static final String DATABASE_NAME = Environment.getExternalStorageDirectory() + "/Sample.db";
// データベースのバージョンを上げる
private static final int DATABASE_VERSION = 2;
public DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase arg0, ConnectionSource arg1) {
try {
TableUtils.createTable(arg1, Account.class);
} catch (SQLException e) {
Log.e(DatabaseHelper.class.getName(), "データベースを作成できませんでした", e);
}
}
@Override
public void onUpgrade(SQLiteDatabase db, ConnectionSource source, int oldVersion,
int newVersion) {
// ここを追加
try {
while(++oldVersion <= newVersion) {
switch (oldVersion) {
// バージョンが2なら年齢フィールドを追加
case 2:
Dao<Account,Integer> dao = getDao(Account.class);
dao.executeRaw("ALTER TABLE `accounts` ADD COLUMN `age` INTEGER;");
break;
default:
break;
}
}
}catch(SQLException e) {
Log.e(DatabaseHelper.class.getName(), "Accountを変更できませんでした", e);
}
}
}
起動してデータベースの中身を確認します。
データベースはきちんと更新されているようです。
しかし!この方法ですと、Accountクラスにフィールドを追加したら「手動で」データベースのバージョンを変更し、マイグレーションのクエリを記述する必要があります(当たり前か)。でも間違えそうですし、チームでの作業にも影響しそうです。なんとか省力化する方法を考えよう。


0 件のコメント:
コメントを投稿