Room数据库的版本升级姿势

当开发中使用了Google的Room框架的话,当你在之后的版本中新增了表或者改动了某些表结构的话,你就需要对数据库的版本号进行相应的更新,现在整理两种更新方式:

作死型方式

之所以叫作死型方式就是这种方式会清空数据库中的数据,所以要使用这种方式之前一定要慎重考虑。
如果你不想写Migration的相关代码,那么你就用下面的方式:

@Database(entities = {User.class}, version = 3)
public abstract class UsersDatabase extends RoomDatabase
database = Room.databaseBuilder(context.getApplicationContext(),
                        UsersDatabase.class, "Sample.db")
                 //添加下面这一行
                .fallbackToDestructiveMigration()
                .build();

fallbackToDestructiveMigration这行代码所做的操作:

  1. 所有表都会被丢弃,同时 identity_hash 被插入

正确姿势

  1. 修改数据库版本号
@Database(entities = {User.class}, version = 2)
public abstract class UsersDatabase extends RoomDatabase
  1. 创建Migration,1和2分别代表上一个版本和新的版本
static final Migration MIGRATION_1_2 = new Migration(1, 2) {
    @Override
    public void migrate(SupportSQLiteDatabase database) {
      //此处对于数据库中的所有更新都需要写下面的代码
        database.execSQL("ALTER TABLE users "
                + " ADD COLUMN last_update INTEGER");
    }
};
  1. 把migration 添加到 Room database builder
database = Room.databaseBuilder(context.getApplicationContext(),
        UsersDatabase.class, "Sample.db")
         //增加下面这一行
        .addMigrations(MIGRATION_1_2)
        .build();

说明:SQLite的ALTER TABLE命令非常局限,只支持重命名表以及添加新的字段。

参考文章

https://developer.android.com/training/data-storage/room/migrating-db-versions.html
http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2017/0728/8278.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容