领域备份和迁移到新版本

Realm Backup and Migration to a new version

我正面临一个问题,即尝试将旧的 Realm 结构迁移到具有新的 RealmObject 和参数的新结构。问题是,该应用程序已经在 Google Play 中,因此用户已经将特定数据存储在某些表中。目标是在删除领域数据库之前恢复数据并将其存储在其他地方。我现在很纠结怎么办。

为了解决这个问题,我在我的应用程序 class 中实施了以下内容:

RealmMigration migration = new RealmMigration(){
    @Override
    public void migrate(...){
        if(oldVersion == 0){
            //Get the data from realm and store somewhere else
        }
    }
}

RealmConfiguration realmConfiguration = new RealmConfiguration.Builder(this)
         .schemaVersion(1)
         .migration(migration)
         .deleteRealmIfMigrationNeeded()
         .build();
Realm.setDefaultConfiguration(realmConfiguration);
Realm.getInstance(realmConfiguration);

这里的问题是,这样做,执行了方法deleteRealmIfMigrationNeeded()而没有执行migration(),那么在我从数据库中获取数据之前所有数据都丢失了。我想要的是,在更新应用程序时,我可以从数据库中获取版本,比较它是否是旧版本并将 Realm 中的数据存储在文件中,然后执行 deleteRealmIfMigrationNeeded() 以避免RealmMigrationNeededException。

我已经看过以下链接:


https://github.com/realm/realm-cocoa/issues/3583

我通过在 migrate() 方法中添加正确的 RealmSchema 解决了这个问题。类似于:

RealmMigration migration = new RealmMigration(){
    @Override
    public void migrate(...){
        final RealmSchema = relam.getSchema();
        if(oldVersion == 0){
            if(!schema.get("Person").getPrimaryKey().equals("codePerson")){
                schema.get("Person")
                    .removePrimaryKey()
                    .addPrimaryKey("codePerson");
            }

            //There are other similar statements here
        }
    }
}

然后我从 RealmConfiguration 中删除了 deleteRealmIfMigrationNeeded() 方法。

它解决了 RealmMigrationNeededException,因此应用程序正确启动。