2016-11-02 5 views
1

.deleteRealmIfMigrationNeeded()へのフォールバック:私は何をしたいのかアンドロイドRealm.ioの移行:新しいスキーマにAndroidのRealm.ioインスタンスを移行するとき、私は私のマイグレーションの実装に移行手順を提供

RealmConfiguration config = new RealmConfiguration 
      .Builder(this) 
      .schemaVersion(SCHEMA_VERSION) 
      .migration(new Migration()) 
      .build(); 

実際の移行コード古いスキーマバージョンの場合はdeleteRealmIfMigrationNeededにフォールバックしたいと考えています。

これを行う方法はありますか?私はdeleteAll()でそれをやろうとしましたが、古いバージョンのアプリケーションからアップデートしている人たちがRealm検証エラーを受け取っているので、動作しないようです。あなたが動的モードでレルムを開いて、それのバージョンを求めることを試みることができ

final RealmConfiguration.Builder builder=new RealmConfiguration.Builder(this); 
    builder.schemaVersion(SCHEMA_VERSION); 
    if (SCHEMA_VERSION < 105) { 
     builder.deleteRealmIfMigrationNeeded(); 
    } else { 
     builder.migration(new Migration()); 
    } 
    final RealmConfiguration config = builder.build(); 
+0

古いバージョンの「deleteRealmIfMigrationNeeded」に対する「フォールバック」とはどういう意味ですか?移行の要点は古いバージョンをアップグレードできることですか? –

+0

@ChristianMelchior、私が意味することは、すべての古いバージョンの移行を書きたくないということです。このアプリでは長い伝統が残っています。最新のバージョンをいくつか使用して移行をサポートしたいだけです(将来的には移行スクリプトを最新の状態に保つ)。私たちが持っている時間枠では、古いバージョンのすべての古いバージョンの移行を記述することはできませんでした。したがって、私はちょうど私たちがdeleteRealmIfMigrationNeededをそのような場合に呼び出すかのようにデータベース全体を拭いて、新しいものに移行したいと思います。 – Juhani

答えて

3

:の効果に何かについて

public class Migration implements RealmMigration { 
    @Override 
    public void migrate(DynamicRealm realm, long oldVersion, long newVersion) { 

     if (oldVersion < 105) { 
      realm.deleteAll(); 
      return; 
     } 

     //handle newer schema versions 


    } 
} 
+0

華麗な、これはうまくいきます! – Juhani

0

方法。 DynamicRealms移行をトリガしません。

RealmConfiguration config = new RealmConfiguration 
      .Builder(this) 
      .schemaVersion(SCHEMA_VERSION) 
      .migration(new Migration()) 
      .build(); 

// Use DynamicRealm to find version and delete it if it is too old 
DynamicRealm dRealm = DynamicRealm.getInstance(config); 
boolean delete = dRealm.getVersion() < 42; 
dRealm.close(); 
if (delete) { 
    Realm.deleteRealm(config); 
} 

Realm realm = Realm.getInstance(config); 
+0

これには以前のスキーマバージョンが必要です。ビルダーを呼び出す前に古いスキーマのバージョンを取得できるかどうか分かりますか? – Juhani

+0

私の頭の上から外す:バージョンを読むためにRealmConfigurationをビルドする: 'long currentVersion = new RealmConfiguration.Builder(this).getSchemaVersion()' –

+0

これは良いアイデアだが、うまくいかないようだ。( – Juhani

1

移行内のクラスをクリアするには、あなたがレルム内にあるすべてのクラスを削除し、レルムが使用するのと同じ方法論を使用してクラスを復元​​することができます。

package io.realm; 

public class Migration implements RealmMigration { 
    @Override 
    public void migrate(DynamicRealm realm, long oldVersion, long newVersion) { 
     RealmConfiguration configuration = realm.getConfiguration(); 
     if(oldVersion < 105) { 
      RealmSchema schema = realm.getSchema(); 
      Set<RealmObjectSchema> classSchemas = schema.getAll(); 
      for(RealmObjectSchema classSchema : classSchemas) { 
       schema.remove(classSchema.getClassName()); 
      } 
     } 
     Set<Class<? extends RealmModel>> currentModels = configuration.getRealmObjectClasses(); 
     Set<Class<? extends RealmModel>> nonExistentModels = new HashSet<>(); 
     for(Class<?> clazz : currentModels) { 
      if(!schema.contains(clazz.getCanonicalName()) { 
       nonExistentModels.put(clazz); 
      } else { 
       // TODO: migrate current classes that do exist 
      } 
     } 

     for(Class<?> nonExistentClazz : nonExistentModels) { 
      // partly taken from Realm 1.1.1's Realm.java : initializeRealm(Realm) method 
      RealmProxyMediator mediator = configuration.getSchemaMediator(); // package internal 
      mediator.createTable(modelClass, realm.sharedGroupManager.getTransaction()); // package internal 
     } 
    } 
} 

公平であるが、これはパッケージ内部の魔法を使用し、Christian Melchiorの答えはより簡単であり、そのような魔法のようなものに依存しない。

また、ここに直接書きましたので、実際には実行していません。

関連する問題