Android 更新应用程序时如何从域迁移数据
我是新来的。我将realm用作本地数据库,如果应用程序被更新,我不想丢失数据。我之前做的是Android 更新应用程序时如何从域迁移数据,android,realm,realm-migration,Android,Realm,Realm Migration,我是新来的。我将realm用作本地数据库,如果应用程序被更新,我不想丢失数据。我之前做的是 public static Realm getRealmInstanse(){ RealmConfiguration config = new RealmConfiguration .Builder() .deleteRealmIfMigrationNeeded() .build();
public static Realm getRealmInstanse(){
RealmConfiguration config = new RealmConfiguration
.Builder()
.deleteRealmIfMigrationNeeded()
.build();
try {
return Realm.getInstance(config);
} catch (RealmMigrationNeededException e){
try {
Realm.deleteRealm(config);
//Realm file has been deleted.
return Realm.getInstance(config);
} catch (Exception ex){
throw ex;
//No Realm file to remove.
}
}
}
现在我想我应该做以下几点:
public static Realm getRealmInstanse(){
RealmConfiguration config = new RealmConfiguration
.Builder()
.migration(new RealmMigration() {
@Override
public void migrate(DynamicRealm realm, long oldVersion, long newVersion) {
}
})
.build();
return Realm.getInstance(config);
}
为了复制数据,我应该在migrate()方法中做什么?关于模式,我应该使用模式版本吗?用于什么目的
改变模式的逻辑是什么?例如,如果出于某种原因我要更改数据库的结构,我可以只更改migrate()方法中的模式吗
我发现了这个示例,但我不知道它实际上是在保存数据还是只是在更改模式
if (oldVersion == 0) {
RealmObjectSchema personSchema = schema.get("Person");
// Combine 'firstName' and 'lastName' in a new field called 'fullName'
personSchema
.addField("fullName", String.class, FieldAttribute.REQUIRED)
.transform(new RealmObjectSchema.Function() {
@Override
public void apply(DynamicRealmObject obj) {
obj.set("fullName", obj.getString("firstName") + " " + obj.getString("lastName"));
}
})
.removeField("firstName")
.removeField("lastName");
oldVersion++;
}
为了复制数据,我应该在migrate()方法中做什么
无,在应用程序更新之间自动保留数据(前提是您在执行deleteRealMifMigrationRequired()
时未更改架构)
如果更改数据库架构并设置了deleteRealMifMigrationRequired()
,则数据将被删除,以便自动迁移到新架构
如果您更改数据库架构并设置了notsetdeleteRealMifMigrationRequired()
,则必须提供RealMigration,否则应用程序将因“需要迁移”异常而崩溃
例如,如果出于某种原因我要更改数据库的结构,我可以只更改migrate()方法中的模式吗
对。您可以与传递给@Override public void migrate()
的DynamicRealm交互,以指定迁移到新架构版本所需的更改
你应该读一读
旁注:在代码中构建RealmConfiguration应该而不是每次请求实例时都进行。相反,最好在应用程序类中执行一次。另请参见。我对旁注有点困惑。我看到,在RealmRepo中,他们也多次在配置中使用getInstance,但在应用程序中,他们只使用realm.init(这个)。另外,如果在migrate()方法中更改模式,它会自动删除数据吗?e、 也许我应该在应用程序的领域实例中保存somwhere,并在应用程序启动时初始化它。它能工作吗?请阅读我链接到的realm网站上的文档,它比我能找到的更好地解释了一切,谢谢realm.setDefaultConfiguration(config);