更新应用程序时如何从领域迁移数据
How to migrate data from realm when updating application
我是 Realm 的新手。我将 realm 用作本地数据库,如果应用程序已更新,我不想丢失数据。我之前做的是
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++;
}
What should i do inside migrate() method in order to copy the data?
没有,数据会在应用程序更新之间自动保留(前提是您没有更改模式同时还 deleteRealmIfMigrationNeeded()
)。
如果您更改数据库架构并已设置 deleteRealmIfMigrationNeeded()
,数据将被删除以便自动迁移到新架构。
如果您更改数据库架构并且未设置deleteRealmIfMigrationNeeded()
,您必须提供RealmMigration,否则应用程序将崩溃并出现"migration needed"异常.
For example, if for some reason i will change the structure of the db, can i just change the schema inside migrate() method?
是的。您可以与传递给 @Override public void migrate()
的 DynamicRealm 进行交互,以指定迁移到新架构版本所需的更改。
你应该读一读 Realm 的 migration documentation。
旁注:像您在代码中所做的那样构建 RealmConfiguration 应该不 每次请求实例时都完成。相反,只做一次,最好在您的应用程序中 class。另见 configuring a realm.
我是 Realm 的新手。我将 realm 用作本地数据库,如果应用程序已更新,我不想丢失数据。我之前做的是
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++;
}
What should i do inside migrate() method in order to copy the data?
没有,数据会在应用程序更新之间自动保留(前提是您没有更改模式同时还 deleteRealmIfMigrationNeeded()
)。
如果您更改数据库架构并已设置 deleteRealmIfMigrationNeeded()
,数据将被删除以便自动迁移到新架构。
如果您更改数据库架构并且未设置deleteRealmIfMigrationNeeded()
,您必须提供RealmMigration,否则应用程序将崩溃并出现"migration needed"异常.
For example, if for some reason i will change the structure of the db, can i just change the schema inside migrate() method?
是的。您可以与传递给 @Override public void migrate()
的 DynamicRealm 进行交互,以指定迁移到新架构版本所需的更改。
你应该读一读 Realm 的 migration documentation。
旁注:像您在代码中所做的那样构建 RealmConfiguration 应该不 每次请求实例时都完成。相反,只做一次,最好在您的应用程序中 class。另见 configuring a realm.