Android——Room数据库版本管理(保留现有数据不丢失)

在使用Room工具创建database时会添加@Database(entities = {Word.class},version = 1,exportSchema = false),其中

  • entities = {Word.class}的{}中来填写entity,可添加多个。

  • version 是当前数据库版本。

当我们想要在实体类中添加其他字段时,需要更改数据库版本并要将原来数据库中的数据保存到新的数据库中。

我这次将上次的实例进行修改,想要了解详细实例请点击Room----Android数据库(SQLite)

更改如下:

在Word.java中添加两个新的字段"foo_data","bar"

@ColumnInfo(name = "foo_data")
    private boolean foo;
    @ColumnInfo(name = "bar")
    private boolean bar;
 
     public boolean isBar() {
         return bar;
     }
 
     public void setBar(boolean bar) {
         this.bar = bar;
     }
 
     public boolean isFoo() {
         return foo;
     }
 
     public void setFoo(boolean foo) {
         this.foo = foo;
     }

同时修改database

 @Database(entities = {Word.class}, version = 2, exportSchema = false)
 public abstract class WordDataBase extends RoomDatabase {
     private static WordDataBase INSTANCE;
 
     static synchronized WordDataBase getDatabase(Context context) {
         if (INSTANCE == null) {
             INSTANCE = Room.databaseBuilder(context.getApplicationContext(), WordDataBase.class, "word_database")
                     //.fallbackToDestructiveMigration()   //这个方法也可以迁移数据库,但会将数据摧毁导致数据的丢失
                     .addMigrations(MIGRATION_1_2)
                    .build();
         }
         return INSTANCE;
     }
 
     public abstract WordDao getWordDao();
 
     static final Migration MIGRATION_1_2 = new Migration(1, 2) { 
         @Override
         public void migrate(@NonNull SupportSQLiteDatabase database) {
             database.execSQL("ALTER TABLE word ADD COLUMN bar INTEGER NOT NULL DEFAULT 1");
         }
     };
 }

其中将数据库版本进行更改 version = 2,使用addMigrations()方法迁移数据库并保存数据

static final Migration MIGRATION_1_2 = new Migration(1, 2) 中的new Migration(1, 2)是数据库版本变化。

database.execSQL("ALTER TABLE word ADD COLUMN bar INTEGER NOT NULL DEFAULT 1")对bar添加缺省值1。

查看新的数据库

这样数据库版本就进行了迁移同时数据也未丢失。

 

而在实体中减少用例的操作则比较麻烦,需要四步操作

1、新建一个表,实体类包括所需要的

2、将原来旧的表中的数据插入新创建的表中

3、删除原来的旧表

4、将新创建的表重命名为原来表的名字

 

例如将新增的字段"foo_data","bar"去除所需要的操作:

     static final Migration MIGRATION_2_3 = new Migration(2, 3) {
         @Override
         public void migrate(@NonNull SupportSQLiteDatabase database) {
             database.execSQL("CREATE TABLE word_temp (id INTEGER PRIMARY KEY NOT NULL,english_word TEXT," +
                     "chinese_meaning TEXT)");
             database.execSQL("INSERT INTO word_temp (id,english_word,chinese_meaning)" +
                     "SELECT id,english_word,chinese_meaning FROM word");
             database.execSQL("DROP TABLE word");
             database.execSQL("ALTER TABLE word_temp RENAME to word");
         }
     };

别忘了修改数据库版本

查看数据库

 

 

 

 

posted @ 2020-02-04 15:34  嘉禾旧木  阅读(2134)  评论(0编辑  收藏  举报