Warning: file_put_contents(/datas/wwwroot/jiajiahui/core/caches/caches_template/2/default/show.php): failed to open stream: Permission denied in /datas/wwwroot/jiajiahui/core/libraries/classes/template_cache.class.php on line 55

Warning: chmod(): Operation not permitted in /datas/wwwroot/jiajiahui/core/libraries/classes/template_cache.class.php on line 56
Android室持久性库 - 如何更改数据库版本 - 源码之家

Android室持久性库 - 如何更改数据库版本

问题描述:

在更新数据库版本后,我不清楚如何使用roomAndroid室持久性库 - 如何更改数据库版本

例如,可以说,我原本在房间中定义的以下数据库:

@Database(entities = {Event.class}, version = 1) 
@TypeConverters(DateTypeConverter.class) 
public abstract class EventDatabase extends RoomDatabase { 

    public abstract EventDao eventDao(); 

} 

,然后我改变的版本,所以它看起来像现在这样:

@Database(entities = {Event.class}, version = 2) 
@TypeConverters(DateTypeConverter.class) 
public abstract class EventDatabase extends RoomDatabase { 

    public abstract EventDao eventDao(); 

} 

当我看到更改版本我的意思是我可能已添加或删除数据库中的列,所以它不一样。我的问题如下:

我现在需要维护两个数据库吗? v1和v2?有没有办法将实体轻松复制到v2?在更改版本时,是否足以将其从1更改为2,或者是否必须创建另一个类,例如EventDatabase2?

也在这里是房间里的版本我使用:android.arch.persistence.room:runtime:1.0.0-alpha1

+1

https://developer.android.com/topic/libraries/architecture/room.html#db -higration – CommonsWare

所以,可以说,我有一个新的应用程序版本和一个新的数据库版本也。我只需要更改版本= 2这样的:

@Database(entities = {Event.class}, version = 2) 
@TypeConverters(DateTypeConverter.class) 
public abstract class EventDatabase extends RoomDatabase { 

    public abstract EventDao eventDao(); 

} 

,然后提供移民政策是这样的:

Room.databaseBuilder(getApplicationContext(), MyDb.class, "database-name") 
     .addMigrations(MIGRATION_1_2).build(); 

static final Migration MIGRATION_1_2 = new Migration(1, 2) { 
    @Override 
    public void migrate(SupportSQLiteDatabase database) { 
     database.execSQL("CREATE TABLE `Fruit` (`id` INTEGER, " 
       + "`name` TEXT, PRIMARY KEY(`id`))"); 
    } 
}; 

这里的关键是,如果不提供移民政策似乎在整个数据库被重建(所以你的用户会丢失所有以前的数据)。

这是根据@commonsWare更新link提供。

+0

但是这个[documentation](https://developer.android.com/training/data-storage/room/migrating-db-versions.html)明确地说t帽子迁移不清除您的所有数据: _如果您不提供必要的迁移,则会重建数据库,这意味着您将丢失数据库中的所有数据._ – Yoda066

+0

这已经在我的回答。 – j2emanue

+0

对不起,我一定误会了。 – Yoda066

另一种选择: 您可以在DB模式进行修改后的更新数据库的版本号,并在同一时间,你可以在你的数据库对象的建设使用fallbackToDestructiveMigration()方法,如果你不想提供迁移计划,只是应用所需的更改,但它总是建议提供迁移跟踪:

@Provides 
@Singleton 
fun provideCryptocurrenciesDatabase(app: Application): Database = Room.databaseBuilder(app, 
    Database::class.java, "my_db").fallbackToDestructiveMigration().build()