2017-06-09 10 views
0

主キーとして使用するプロパティを含むいくつかのオブジェクトモデルを更新する必要がある場合がいくつかあります。例えばレルムの移行における主キーの更新

  • (例えばジョンソン、スミス...)主キーname(例えばジョルジュ、アンナ...)、およびfamilyNameプロパティをマージし、新しいことに使いますname(例えば、Georges Johnson ...)をプライマリキーとしてマージしました。
  • String

を入力するタイプIntからidentifier主キーを作成します。しかし、もちろんドキュメントがはっきりと述べている:、主キーを持つオブジェクトがレルムに追加されると

主をキーを変更することはできません

古いオブジェクトを削除して新しいオブジェクトを作成することはできますが、これは複雑な作業を繰り返して関係。

そして、realmがidentifierのどちらかの方法で(私が遭遇した例外を例外として)タイプの変更に満足できないことは間違いないでしょう。

そう簡単な方法があるのか​​、私の非常に簡単な目標を達成するために多くの手作業をしなければならないのだろうかと思いました。

+0

もっと簡単な方法があります。主キーとして変更される可能性のあるフィールドは使用しないでください。一意の識別子を作成するか、レルムがあなたのために行うようにします。 – Mozahler

答えて

2

ここからカツミ。レルムは主キーの移行をサポートします。 主キーは、移行中にのみ変更できます。既存の主キーの値を変更したい場合は、移行ブロックを作成して、新しいオブジェクトごとに新しい値を割り当てることができます。値はもちろん、一意でなければなりません。

let config = Realm.Configuration(schemaVersion: 1, migrationBlock: { (migration, schemaVersion) in 
    migration.enumerateObjects(ofType: "Person", { (oldObject, newObject) in 
     newObject!["key"] = ... 
    }) 
}) 

プライマリキーの種類も変更できます。 その場合は、移行ブロックを作成して新しい値を割り当てる必要もあります。型を変更すると主キーのプロパティがクリアされるためです。また、既存の主キーのプロパティをマージまたは分割することもできます。新しいプロパティを追加してプライマリキーとして指定すると、マイグレーションブロックを作成して新しい一意の値を割り当てる必要があります。

ただし、Realm(2.8.0および2.8.1)の最新バージョンでは、移行中にも主キーの変更を許可しない意図しないバグがありました。緊急でない場合は、以前のバージョン(2.7.x)を使用してください。緊急でない場合は、次のリリースでバグを修正してください。

+0

私の問題は実際にはレルムバージョンによって引き起こされることになるので、それが私が本当に混乱した理由です。あなたの良い仕事とサポートのために多くのことをありがとう、私はダウングレードしようとし、これがどうなるかを見てみましょう。 –

+0

私は2.7.0にダウングレードされ、すべてのものが期待どおりに再動作します。 –

関連する問題