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");
         }
     };

別忘了修改數據庫版本

查看數據庫

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM