Android 更新应用程序时如何从域迁移数据

Android 更新应用程序时如何从域迁移数据,android,realm,realm-migration,Android,Realm,Realm Migration,我是新来的。我将realm用作本地数据库,如果应用程序被更新,我不想丢失数据。我之前做的是 public static Realm getRealmInstanse(){ RealmConfiguration config = new RealmConfiguration .Builder() .deleteRealmIfMigrationNeeded() .build();

我是新来的。我将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++;
    }
为了复制数据,我应该在migrate()方法中做什么

无,在应用程序更新之间自动保留数据(前提是您在执行
deleteRealMifMigrationRequired()
时未更改架构)

如果更改数据库架构并设置了
deleteRealMifMigrationRequired()
,则数据将被删除,以便自动迁移到新架构

如果您更改数据库架构并设置了notset
deleteRealMifMigrationRequired()
,则必须提供RealMigration,否则应用程序将因“需要迁移”异常而崩溃

例如,如果出于某种原因我要更改数据库的结构,我可以只更改migrate()方法中的模式吗

对。您可以与传递给
@Override public void migrate()
的DynamicRealm交互,以指定迁移到新架构版本所需的更改

你应该读一读



旁注:在代码中构建RealmConfiguration应该而不是每次请求实例时都进行。相反,最好在应用程序类中执行一次。另请参见。

我对旁注有点困惑。我看到,在RealmRepo中,他们也多次在配置中使用getInstance,但在应用程序中,他们只使用realm.init(这个)。另外,如果在migrate()方法中更改模式,它会自动删除数据吗?e、 也许我应该在应用程序的领域实例中保存somwhere,并在应用程序启动时初始化它。它能工作吗?请阅读我链接到的realm网站上的文档,它比我能找到的更好地解释了一切,谢谢realm.setDefaultConfiguration(config);