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-int
una 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 week
y String time
se descompone en int wMin;int wMax
bien 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 PeopleDatabase
la etiqueta que define la interfaz de la base de datos , configure version
el 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 addMigrations
para 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");
}
};