Room数据库的版本升级姿势

作者: 小菜鸟程序媛 | 来源:发表于2018-04-19 14:29 被阅读36次

    当开发中使用了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

    相关文章

      网友评论

      本文标题:Room数据库的版本升级姿势

      本文链接:https://www.haomeiwen.com/subject/jmrwkftx.html