JectPack组件开发6-------Room(另一种方式访问SQLite数据库)3

当数据库创建完成之后,如果想要在数据库表中,添加新的字段,那么就涉及到数据库的版本迁移,这样能够保证数据库中的数据不会丢失。

1、版本迁移

@Entity
public class Student {
    //主键,自增长
    @PrimaryKey(autoGenerate = true)
    private int _id;
    //列名
    @ColumnInfo(name = "name")
    private String name;
    @ColumnInfo(name = "age")
    private int age;

这个数据表是之前创建的,有3个字段,现在我想新增加一个字段,然后插入该字段的值,如果只是这样插入字段,那么在插入数据时必然会报错,因为当前版本的数据库中,不存在这个字段。

@ColumnInfo(name = "grade")
    private int grade;

    public int getGrade() {
        return grade;
    }

    public void setGrade(int grade) {
        this.grade = grade;
    }

如果只是修改数据库的版本号,还是不行,还是会报错,还得通过migration进行版本迁移完成版本的更替。
JectPack组件开发6-------Room(另一种方式访问SQLite数据库)3_第1张图片
数据库版本迁移的方式有两种:

(1)“毁灭式”的版本迁移

fallbackToDestructiveMigration()

这种方式可以完成数据库的版本迁移,但是之前数据库的数据将会全部清除。

(2)底层修改

如果想要保留之前数据库版本的数据,那么就需要底层修改,通过addMigrations

public synchronized static StudentDataBase getInstance(Context context){
        if(instance == null){
            instance = Room.databaseBuilder(context.getApplicationContext(),
                    StudentDataBase.class,"student_database")
//                    .fallbackToDestructiveMigration()
                    .addMigrations(MG_1to2)
//                    .allowMainThreadQueries()
                    .build();
        }
        return instance;
    }
 //版本迁移
    static final Migration MG_1to2 = new Migration(1,2) {
        @Override
        public void migrate(@NonNull SupportSQLiteDatabase database) {
            database.execSQL("ALTER TABLE Student ADD COLUMN grade INTEGER NOT NULL DEFAULT 1");
        }
    };

你可能感兴趣的:(JectPack组件开发6-------Room(另一种方式访问SQLite数据库)3)