【问题标题】:How to migrate data from realm when updating application更新应用程序时如何从领域迁移数据
【发布时间】:2017-01-13 11:34:07
【问题描述】:

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

【问题讨论】:

    标签: android realm realm-migration


    【解决方案1】:

    为了复制数据,我应该在 migrate() 方法中做什么?

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

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

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

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

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

    您应该阅读 Realm 的 migration documentation


    旁注:每次请求实例时都应该像在代码中那样构建 RealmConfiguration。相反,只做一次,最好是在你的 Application 类中。另见configuring a realm

    【讨论】:

    • 我对旁注有点困惑。我看到在领域回购中,他们也多次使用 getInstance 和配置,但在应用程序中他们只使用 Realm.init(this)。另外,在 migrate() 方法中更改架构怎么样,它会自动删除数据吗?例如personSchema .addField(....)
    • 也许我应该将领域实例保存在应用程序内部的某个位置,并在应用程序启动时对其进行初始化。它会起作用吗?
    • 请阅读我链接到的领域网站上的文档,它比我能更好地解释一切
    • 我找到了我需要的东西,谢谢 Realm.setDefaultConfiguration(config);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-15
    • 2011-07-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多