Roomを実装した際に遭遇したエラーと対処方法をまとめていきます。
Roomの実装方法はこちらで紹介しています。
- Schema export directory is not provided to the annotation processor so we cannot export the schema.
- java.lang.IllegalStateException: Cannot access database on the main thread since it may potentially lock the UI for a long period of time.
- 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
- A migration from 1 to 2 was required but not found
Schema export directory is not provided to the annotation processor so we cannot export the schema.
スキーマをエクスポートするディレクトリを指定する。もしくは、”export=false”を指定する。
”export=false” を指定する場合は、@Databaseアノテーションの宣言時に指定する。
@Database(entities = [User::class], version = 1, exportSchema = false)
java.lang.IllegalStateException: Cannot access database on the main thread since it may potentially lock the UI for a long period of time.
非同期で実装する。
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
DBを変更した場合にバージョンを上げないといけない。
バージョンを変更するには、 @Databaseアノテーションの”version”の数字を変える。
@Database(entities = [User::class], version = 1, exportSchema = false)
A migration from 1 to 2 was required but not found
バージョンを上げた場合に、変更内容を書かないといけない。
新しくテーブルを追加した場合はCreate、カラム変更をした場合はAlter Tableといったように変更内容に応じて処理を書く必要がある。
fun getDatabase(context: Context): AppDatabase { val MIGRATION_1_2: Migration = object : Migration(1, 2) { override fun migrate(database: SupportSQLiteDatabase) { //バージョン1→2にあげる処理 } } return INSTANCE ?: synchronized(this) { val instance = Room.databaseBuilder( context.applicationContext, AppDatabase::class.java, "user_database") .addMigrations(MIGRATION_1_2) //バージョン1→2にあげる処理 .build() INSTANCE = instance // return instance instance } }