Notas de estudio de Jetpack (2): actualización de base de datos-agregar, eliminar campos y migrar datos

Prólogo

He creado una aplicación de programación de cursos de Android antes. En ese momento, usaba el tiempo y la semana para almacenar el número de secciones del curso y el número de semanas del curso. Su estructura es int-intuna cadena de tipo, por lo que necesito dividir y convertir la cadena a tipo int cada vez. proceso, por lo que en mi actualización de la versión optimiza la estructura de datos, el original String weeky String timese descompone en int wMin;int wMaxbien int tMin; int tMax; pero fue inútil ya que la actualización de la base de datos de aprendizaje, acabo de borrar la base de datos, no sólo provocó la pérdida de los datos originales, sino también llevar a Debe desinstalar el software previamente instalado cuando actualice el software. Ahora puede usar las actualizaciones de la base de datos para resolver perfectamente problemas similares.

Atencion Aquí, la arquitectura ROOM de Jetpack se utiliza para procesar la base de datos.
Continuación de la nota anterior Notas de estudio de Jetpack (1): Base de datos de gestión de salas


Agregar campo

1. Actualizar objetos de entidad

Agregue un campo de cadena al objeto Personas en el artículo anterior

@ColumnInfo(name ="home")
    private String home="";

Nota: debe agregar get / set o recibirá un error

2. Actualice la versión de la base de datos.

Antes de actualizar PeopleDatabasela etiqueta que define la interfaz de la base de datos , configure versionel atributo para que sea más alto que la versión anterior

@Database(entities = {People.class},version = 18)

Construir una nueva base de datos

 INSTANCE= Room.databaseBuilder(context.getApplicationContext(),PeopleDatabase.class,"peo_data")                    .fallbackToDestructiveMigration()
                    .build();

.fallbackToDestructiveMigration()Esa fuerza una actualización, perderá perder todos los datos

3. Migrar datos

Si desea conservar los datos, debe definir un método de migración de datos.Migration

//参数 从版本  A to B 添加字段
    static final Migration MIGRATION_16_17 =new Migration(16,17) {
        @Override
        public void migrate(@NonNull SupportSQLiteDatabase database) {
            //添加一列叫
            database.execSQL("ALTER TABLE People ADD COLUMN home TEXT");
        }
    };

Al mismo tiempo, cuando construya una nueva base de datos, fallbackToDestructiveMigration()modifique este método de actualización violenta addMigrationspara proporcionar un método de migración y llame al método de migración recién definido

INSTANCE= Room.databaseBuilder(context.getApplicationContext(),PeopleDatabase.class,"peo_data")
                    .addMigrations(MIGRATION_17_18)
                    .build();

Eliminar campo

1. Actualizar la entidad

Igual que el anterior, elimine campos innecesarios y elimine el método get / set relacionado

2. Migrar datos

Debido a que SQLite no tiene un método para eliminar campos, la eliminación de un campo requiere cuatro pasos: Primero, cree una base de datos temporal = tabla, copie los datos anteriores a la tabla de datos temporal según sea necesario, elimine la tabla de datos anterior y cambie el nombre de la tabla de datos temporal:

2-1, cree una tabla de datos temporal
database.execSQL("CREATE TABLE people_temp(_id INTEGER PRIMARY KEY NOT NULL , name TEXT , college TEXT )");
2-2. Migrando datos
 database.execSQL("INSERT INTO people_temp(_id,name,college) " +
                    "SELECT _id,name,college FROM People");
2-3, elimine la tabla anterior
database.execSQL("DROP TABLE People");
2-4. Renombrado la nueva tabla
 database.execSQL("ALTER TABLE people_temp RENAME TO People");

3. Construir una nueva base de datos

Como se indicó anteriormente, aumente la versión de la base de datos y agregue un método de migración

   INSTANCE= Room.databaseBuilder(context.getApplicationContext(),PeopleDatabase.class,"peo_data")
                    .addMigrations(MIGRATION_17_18)
                    .build();
  static final  Migration MIGRATION_17_18=new Migration(17,18) {
        @Override
        public void migrate(@NonNull SupportSQLiteDatabase database) {
            //创建临时表
            database.execSQL("CREATE TABLE people_temp(_id INTEGER PRIMARY KEY NOT NULL , name TEXT , college TEXT )");
            //迁移复制数据
            database.execSQL("INSERT INTO people_temp(_id,name,college) " +
                    "SELECT _id,name,college FROM People");
            //删除旧表
            database.execSQL("DROP TABLE People");
            //临时表改名
            database.execSQL("ALTER TABLE people_temp RENAME TO People");
        }
    };
Publicó 8 artículos originales · ganó 7 · visitó 1893

Supongo que te gusta

Origin blog.csdn.net/XiaoYunKuaiFei/article/details/105645772
Recomendado
Clasificación