zoukankan      html  css  js  c++  java
  • Android 数据库迁移--自定义数据类型

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


  • 相关阅读:
    Unity Animation扩展方法总结
    Unity 离线建造系统
    Unity 任意区域截屏创建Sprite
    Unity ugui拖动控件(地图模式与物件模式)
    Unity 极简UI框架
    Unity 芯片拼图算法
    Unity Procedural Level Generator 基础总结与功能优化
    MANIFEST.MF是个什么?
    外包程序员怎么办?
    文件上传transferTo一行代码的bug
  • 原文地址:https://www.cnblogs.com/bimingcong/p/14122487.html
Copyright © 2011-2022 走看看