这里拿Room数据库举例,当我们升级数据库时直接修改数据库的版本号,就可以升级数据库版本:

@Database(entities = {PersonA.class, PersonB.class}, exportSchema = false,version = 2)
public abstract class AppDatabase extends RoomDatabase {

 

 1、如果更改了数据库的结构,但是没有配置对应的migration(迁移策略),app崩溃;

 2、如果不想提供迁移策略,直接进行破坏性升级(不保留之前的数据),可以直接使用 fallbackToDestructiveMigration()

    private static AppDatabase buildDatabase(final Context appContext) {
        return Room.databaseBuilder(appContext, AppDatabase.class, DATABASE_NAME)
                .addCallback(new Callback() {
                    @Override
                    public void onCreate(@NonNull SupportSQLiteDatabase db) {
                        super.onCreate(db);
                    }
                })
                .fallbackToDestructiveMigration()
                .allowMainThreadQueries()
                .build();
    }

 

 3、如果想要保留之前的数据,就要提供migration;比如需要给数据库的表添加对应的列:

 private static final Migration MIGRATION_1_2 = new Migration(1, 2) {
        @Override
        public void migrate(@NonNull SupportSQLiteDatabase database) {
            database.execSQL("ALTER TABLE user ADD COLUMN colum1 TEXT");
            database.execSQL("ALTER TABLE user ADD COLUMN colum2 TEXT");
            database.execSQL("ALTER TABLE user  ADD COLUMN colum3 TEXT");
            database.execSQL("ALTER TABLE user ADD COLUMN colum4 TEXT");
        }
    };

 同时 addMigrations(MIGRATION_1_2) 就可以了

 

 4、如果想要重新建一张表,并且将之前的表的数据迁移到新的表中,可以这样写:

public static final Migration MIGRATION_3_4 = new Migration(3, 4) {
    @Override
    public void migrate(SupportSQLiteDatabase database) {
        //  创建新的临时表
        database.execSQL( "CREATE TABLE users_new (userid TEXT, username TEXT, last_update INTEGER, PRIMARY KEY(userid))" );
       // 复制数据
        database.execSQL( "INSERT INTO users_new (userid, username, last_update) SELECT userid, username, last_update FROM users" );
        // 删除表结构
        database.execSQL( "DROP TABLE users" );
        // 临时表名称更改
        database.execSQL( "ALTER TABLE users_new RENAME TO users" );
    }
};

 

 5、上边的全是针对基本的数据类型,如果是自定义的数据类型,那么可以借鉴Room的TypeConverter:

public class PersonsBeanConverter {
    @TypeConverter
    public static List<Person> revert(String personsStr) {
        // 使用Gson方法把json格式的string转成List
        return new Gson().fromJson(personsStr, new TypeToken<List<Person>>() {
        }.getType());
    }

    @TypeConverter
    public static String converter(List<Person> person) {
        // 使用Gson方法把List转成json格式的string,便于我们用的解析
        return new Gson().toJson(person);
    }
}

 通过TypeConverter实则将Person类对象转为json字符串,然后作为String类型 存到了数据库,因此可以作为String 添加到数据库

 private static final Migration MIGRATION_1_2 = new Migration(1, 2) {
        @Override
        public void migrate(@NonNull SupportSQLiteDatabase database) {
            database.execSQL("ALTER TABLE user ADD COLUMN person TEXT");

        }
    };

 

 



 

posted on 2020-12-11 20:11  毕哥  阅读(208)  评论(0编辑  收藏  举报