当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《更新应用程序时如何从领域迁移数据》经验,为你挑选了1个好方法。

我是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);
}

我应该在migration()方法内部做什么才能复制数据?那么,关于架构,我应该使用架构版本吗?

更改架构的逻辑是什么?例如,如果由于某种原因我将更改数据库的结构,是否可以只更改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++;
    }

Tim.. 5

我应该在migration()方法内部做什么才能复制数据?

没什么,数据不会在应用程序更新之间自动保留(前提是您同时也 没有更改架构deleteRealmIfMigrationNeeded())。

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

如果更改数据库架构但未设置deleteRealmIfMigrationNeeded(),则必须提供RealmMigration,否则应用程序将崩溃并显示“需要迁移”异常。

例如,如果由于某种原因我将更改数据库的结构,是否可以只更改migrate()方法中的架构?

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

您应该阅读Realm的迁移文档。


旁注:建设正如你在你的代码做RealmConfiguration应该不会做您每次请求一个实例时。相反,最好只在您的Application类中执行一次。另请参阅配置领域。



1> Tim..:

我应该在migration()方法内部做什么才能复制数据?

没什么,数据不会在应用程序更新之间自动保留(前提是您同时也 没有更改架构deleteRealmIfMigrationNeeded())。

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

如果更改数据库架构但未设置deleteRealmIfMigrationNeeded(),则必须提供RealmMigration,否则应用程序将崩溃并显示“需要迁移”异常。

例如,如果由于某种原因我将更改数据库的结构,是否可以只更改migrate()方法中的架构?

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

您应该阅读Realm的迁移文档。


旁注:建设正如你在你的代码做RealmConfiguration应该不会做您每次请求一个实例时。相反,最好只在您的Application类中执行一次。另请参阅配置领域。

推荐阅读
夏晶阳--艺术
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有