0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

RoomsのデータテーブルMigrationするのしんどすぎてテーブル消した

Last updated at Posted at 2022-06-07

環境?

Android studioで言語はJavaを使ってるよ

発端

初めに何も考えずにRoomsでデータベース作った時,適当なサイトを参考にしてこんな感じでexport_schema=falseを設定してしまった

My_table.java
@Database(entities = {My_Entity.class}, version = 1, export_schema=false)
public abstract class My_Table extends RoomDatabase {
    public abstract My_Dao My_Dao();
}

事の発端はこれ.

問題

このあと何やかんやあって,Entityの仕様を大幅変更した.(カラムの削除と追加をやりたい放題した)

そのあと,シンタックスエラーだけ直してもう一度ビルドしたところ当然のように様々なエラーにであう.
↓例

その1

Room cannot verify the data integrity. Looks like you've changed schema but forgot to update the version number. You can simply fix this by increasing the version number.

テーブルの中身変えたでしょ!バージョン上げなさいよね!
と怒られているので自動でmigrationしてくれないかな〜という期待も込めて次のように書き換え.

@Database(entities = {My_Entity.class}, version = 2, export_schema=false, autoMigrations = {@AutoMigration (from = 1, to = 2)})
public abstract class My_Table extends RoomDatabase {
    public abstract My_Dao My_Dao();
}

その2

Schema export directory is not provided to the annotation processor so we cannot import the schema. To generate auto migrations, you must provide `room.schemaLocation` annotation processor argument AND set exportSchema to true. 

export_schema=falseにしてたら前のバージョンが見れないでしょ!Migrationするならtrueにしときなさいよね!
と怒られているので,(あれ,falseの設定のままテーブルの中身書き換えちゃったよな..?)と嫌な予感をさせながら書き換え.

@Database(entities = {My_Entity.class}, version = 2, autoMigrations = {@AutoMigration (from = 1, to = 2)})
public abstract class My_Table extends RoomDatabase {
    public abstract My_Dao My_Dao();
}

その3

Migration didn't properly handle ...
Expected: ...

はい,嫌な予感が的中しました!
バージョン1をexport_scemeしないまま書き換えてしまったせいで,元のデータテーブルを構成することができずMigrationはもはや機能しません!!!!

対処

幸い,データテーブルには引き継ぎたいデータがまだ全くなかったので,一回データテーブルを消してまっさらにして作り直すことにしました.

データテーブルの所在するActivity内で以下を実行するだけ

public class MainActivity extends AppCompatActivity{
    this.getApplicationContext().deleteDatabase("消したいテーブル名");

まっさらになるので,もう一度version=1にして作り直すことが可能に!
もうexport_schema=falseなんてしない...

0
1
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
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?