代码之家  ›  专栏  ›  技术社区  ›  Alen Lee

如何在android房间持久性库中创建没有迁移版本的表?

  •  1
  • Alen Lee  · 技术社区  · 6 年前

    当我只创建一个表而不更改其他表和数据时,是否需要迁移数据库?

    作为 google tutorial 而且google上,大部分都说我们必须迁移数据库,如果每次升级我都创建表,我必须增加数据库版本和迁移,这很混乱

    1 回复  |  直到 6 年前
        1
  •  2
  •   Wewe    6 年前

    是的,是的。room正在开始时比较数据库模式,如果模式不同,它将运行迁移。如果架构将不同,并且迁移将不会被添加,则可能会引发IllegalStateException。

    更重要的是,当您修改了db版本并且架构没有任何更改时,您应该将迁移对象添加到构建器中。如果没有,房间将清除您的数据库并重新创建它们。你可以在课堂上阅读更多的文档 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 &gt;= 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;
            }