LoginSignup
10
10

More than 5 years have passed since last update.

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

Posted at

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

-

『新規テーブルの追加』は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で上記のように書き換えた。

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

10
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
10