安卓Room学习:数据库版本管理、数据迁移

版本更改

@Entity
public class Word {
    @PrimaryKey(autoGenerate = true)
    private int id;

    @ColumnInfo(name = "english")
    private String word;
    private String chinese;

    @ColumnInfo(name = "foo_data")
    private boolean foo;
}

在原先的数据库实体类之上添加一个元素,此时不进行其他更改直接运行将会报错。

那么就需要更改两个位置:
数据库版本号version

@Database(entities = {Word.class}, version = 2, exportSchema = false)
public abstract class WordDataBase extends RoomDatabase {
}

数据迁移策略

instance = Room.databaseBuilder(context.getApplicationContext(), WordDataBase.class, "word_database")
        .fallbackToDestructiveMigration()
        .build();

fallbackToDestructiveMigration()表示抹去数据库所有内容,使用新的数据库(全空)
addMigrations(MIGRATION_2_3)手动创建迁移策略

    static final Migration MIGRATION_2_3 = new Migration(2, 3) {
        @Override
        public void migrate(@NonNull SupportSQLiteDatabase database) {
            database.execSQL("ALTER TABLE word ADD COLUMN bar_data INTEGER NOT NULL DEFAULT 1");  //添加行
        }
    };

有添加行但是没有删除行的对应函数,所以删除行操作麻烦一些。

    static final Migration MIGRATION_3_4 = new Migration(3, 4) {
        @Override
        public void migrate(@NonNull SupportSQLiteDatabase database) {  //删除行需要创建临时数据库、插入所需值、删除旧表、改名
            database.execSQL("CREATE TABLE word_temp (id INTEGER PRIMARY KEY NOT NULL, english TEXT," +
                    "chinese TEXT)");
            database.execSQL("INSERT INTO word_temp (id, english, chinese) " +
                    "SELECT id, english, chinese FROM word");
            database.execSQL("DROP TABLE word");
            database.execSQL("ALTER TABLE word_temp RENAME TO word");
        }
    };

参数表示版本迁移变化,使用SQL语句进行数据迁移

你可能感兴趣的:(Room,数据库,android,学习)