Reputation: 2509
Does it necessary to migrate the database when I just only create a table without changing other tables and data?
As the google tutorial and googled, most of it said we must migrate database, if I create table per upgrade, I have to increase the database version and migration, it's very confusing
Upvotes: 3
Views: 1590
Reputation: 186
Yes, it is. Room is comparing database schema on the start and if schemas are different it will run the migration. If schema will be different and migration won't be added it will probably throw IllegalStateException.
What is more, when you bumped db version and you have no changes in schemas you should add Migration object to the builder. If not Room will clear your db and recreate them. You can read more in documentation in class RoomDatabase.java
:
/**
* Adds a migration to the builder.
* <p>
* Each Migration has a start and end versions and Room runs these migrations to bring the
* database to the latest version.
* <p>
* If a migration item is missing between current version and the latest version, Room
* will clear the database and recreate so even if you have no changes between 2 versions,
* you should still provide a Migration object to the builder.
* <p>
* A migration can handle more than 1 version (e.g. if you have a faster path to choose when
* going version 3 to 5 without going to version 4). If Room opens a database at version
* 3 and latest version is >= 5, Room will use the migration object that can migrate from
* 3 to 5 instead of 3 to 4 and 4 to 5.
*
* @param migrations The migration object that can modify the database and to the necessary
* changes.
* @return this
*/
@NonNull
public Builder<T> addMigrations(Migration... migrations) {
mMigrationContainer.addMigrations(migrations);
return this;
}
/**
* Allows Room to destructively recreate database tables if {@link Migration}s that would
* migrate old database schemas to the latest schema version are not found.
* <p>
* When the database version on the device does not match the latest schema version, Room
* runs necessary {@link Migration}s on the database.
* <p>
* If it cannot find the set of {@link Migration}s that will bring the database to the
* current version, it will throw an {@link IllegalStateException}.
* <p>
* You can call this method to change this behavior to re-create the database instead of
* crashing.
* <p>
* Note that this will delete all of the data in the database tables managed by Room.
*
* @return this
*/
@NonNull
public Builder<T> fallbackToDestructiveMigration() {
mRequireMigration = false;
return this;
}
Upvotes: 4