9

したがって、ユーザーがバージョン 1.0 のアプリを使用しているシナリオがあります。バージョン 2.0 が出ますが、ユーザーは更新しません。バージョン 3.0 が出ると、ユーザーは更新を決定します。

ユーザーがアプリを更新していないため、レルム ファイルも更新されていないため、バージョン 1.0 からバージョン 3.0 への移行中に、 のversionパラメーターのMigration.execute値は 2 ではなく 1 になります。

ユーザーがアプリのバージョン 2.0 を直接インストールしてからバージョン 3.0 に移行する場合にも問題があります。前の場合と同じように、versionパラメーターが間違っています。

これらのケースを適切に処理する方法はありますか?

4

3 に答える 3

4

実際、Realm の移行例はこのシナリオを示しています。

public class Migration implements RealmMigration {
    @Override
    public long execute(Realm realm, long version) {
        // Step 0
        if (version == 0) {
        //Do the migration from 0 to 1
            version++;
        }

        // Step 1
        // Now the version is at least 1
        if (version == 1) {
        // Do the migration from 1 to 2
           version++;
        }

        // Step 2
        if (version == 2) {
        // Do the migration from 2 to 3
           version++;
        }
        // Now you get your final version 3
        return version;
    }
}

移行を段階的に記述し、最新のスキーマ バージョンを取得するまで 1 つずつ実行するだけです。あなたの場合、ユーザーはここで Realm db バージョン 0 を持っている可能性があり、step0 が最初に実行されます。その後、ステップ 0 ブロックでバージョンが 1 に上がり、ステップ 1 が実行されます。

------------ ユーザーがバージョン 3 を直接インストールする場合の更新 ------------

レルム インスタンスを作成すると、コードは次のようになります。

RealmConfiguration config = new RealmConfiguration.Builder(this)
                             .migration(migration)
                             .schemaVersion(3)
                             .build();
Realm realm = Realm.getInstance(config);

ここに注意してschemaVersion(3)ください。RealmMigration.execute()移行が必要な場合にのみ実行されます。これは、ユーザーが以前のバージョンをデバイスにインストールせずにバージョン 3 を直接インストールした場合、 はRealmMigration.execute()呼び出されず、Realm ファイルが初期化された後にスキーマ バージョンが 3 に設定されることを意味します

于 2015-07-20T04:44:20.747 に答える
0

beeender が言ったように、Realm の移行はかなり変更されました。Realm (0.84.2) の移行を機能させるための重要なポイントは、次のことを理解することでした。

  • schemaVersion を指定せずにアプリにレルム データベースがある場合、schemaVersion は常に 0 です。移行が必要になり、アプリのライブ リリースを既に実行している場合は、構成で schemaVersion を使用し始める可能性が高いため、ほとんどの場合に当てはまります。

  • schemaVersion は自動的に保存され、アプリの新規インストールが発生し、すでに schemaVersion 3 にある場合、レルムは例外があるかどうかを自動的にチェックします。そうでない場合は、schemaVersion を 3 に設定して、不要なときに移行が実行されないようにします。これは、SharedPreferences に何も保存する必要がないことも意味します。

  • 移行では、型が null 許容でない場合、新しい列のすべての値を設定する必要があります...

  • 空の文字列を挿入できますが、列に convertColumnToNullable を設定している場合のみです

于 2015-11-21T10:27:24.567 に答える