这里拿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"); } };