Posted at

ActiveAndroidを使ってテーブル追加したつもりで、モデルを使おうとすると『no such table』と怒られるときの対応

More than 5 years have passed since last update.

しょうもないことでハマった。。

-


『新規テーブルの追加』はDBが作成されるタイミングか、アップロードするタイミングで行われる

と、いうことを知らなかった。

新しいモデルを追加するだけで勝手にテーブル作ってくれるのかな、と甘えていた。

なので、モデル追加してアプリ実行しても『no such table』とエラーが出ていた。

-


ActiveAndroidの処理を理解するためにソースを読む。

DB系の操作を一任されてそうなDataBaseHelper.javaを見てみる。

private void executeCreate(SQLiteDatabase db)

このメソッド内で


executeCreate

private void executeCreate(SQLiteDatabase db) {

db.beginTransaction();
try {
for (TableInfo tableInfo : Cache.getTableInfos()) {
db.execSQL(SQLiteUtils.createTableDefinition(tableInfo));
}
db.setTransactionSuccessful();
}
finally {
db.endTransaction();
}
}

ユーザが定義したテーブル情報をもとにして、テーブルを作っていた。

なので、このexecuteCreateが呼ばれる場所を探す。

同クラスのonCreateonUpgradeで呼ばれていた。

DBは既に作られているので、onCreateではなくonUpgradeを呼ばれるようにする必要がありました。

なので、


AwesomeApplication.java

Configuration.Builder builder = new Configuration.Builder(getBaseContext());

builder.setCacheSize(1024 * 1024 * 4);
builder.setDatabaseName("awesome.db");
// バージョンを1から2へアップグレード
builder.setDatabaseVersion(2);

ActiveAndroid.initialize(builder.create(), true);


ApplicationクラスのonCreateで上記のように書き換えた。

無事テーブルが追加されました。よかった。