2016-04-08 5 views
0

私はCore Dataは、すべての設定およびiOSアプリで働く、と私は、私は可能性を準備するためにコアデータの移行にいくつかのチュートリアルを読んでてきた[[MyEntityClass alloc] initWithEntity:description insertIntoManagedObjectContext:context];コアデータ軽量移行 - 既存のエンティティに新しい属性が追加されていますか?

を使用してインスタンス化されNSManagedObjectのサブクラスを使用しているオブジェクトモデルを管理しています将来のアプリのアップデート。この特定のケースで現在想定している変更については、軽量な移行で十分であると確信しています。私は、軽量の移行で古いデータモデルのデータを新しいバージョンにマッピングすることを理解しています。しかし、永続ストアに移行前に作成されたNSManagedObjectサブクラスインスタンスが含まれている場合、これらのオブジェクトはモデルとともに変更され、移行で追加された属性を使用できるようになりますか?

私が尋ねていることを明確にしているかどうかを確認する例を挙げます。古典的な例であるPersonを使用するエンティティがあるとします。人は次の属性があります。

firstname 
lastname 

私はPersonと呼ばれるaPersonのインスタンスを作成して、これが永続ストアに挿入されています。私はaPerson.firstnameaPerson.lastnameを使ってaPersonの属性にアクセスできます。

今、私は管理オブジェクトモデルにdateofbirth属性を追加し、そのPersonエンティティは以下の属性が含まれています。私は永続ストアからaPersonを取得し、アクセスaPerson.dateofbirthしようとした場合

firstname 
lastname 
dateofbirth 

を、どうなりますか? aPersonにはその属性を追加する前に作成されたdateofbirth属性が含まれていないため、認識できないセレクタエラーが発生しますか?または軽量の移行は、dateofbirth属性とアクセサメソッドをすべて永続ストア内のPersonのすべてのインスタンスに追加しますか?

答えて

1

新しいモデルバージョンに属性を追加する場合は、その属性をオプションにするか、デフォルト値を指定する必要があります。そうしないと、古いモデルで保存された永続ストアは新しいモデルでは検証されません。

あなたの例では、デフォルトのdateofbirthを指定するのは意味がありません。したがって、その属性をオプションにして、それが存在しない場合があることに注意してください。

私はこれに関する明示的な文書を見つけることができません。移行を非常に徹底的にテストする必要があります。

+0

ありがとう、非常に助かりました!したがって、存在しない属性に対処すると言うと、それは 'if([myEntity respondsToSelector:@selector(myMigratedAttributeName)){...}'のようなものになります。 – mashers

+0

メソッドはインスタンスではなくクラスにあります。プロパティを読み、それが 'nil'であるかどうかを確認します。 –

+0

'メソッドはインスタンスではなくクラスにあります。 ' - はい。ただし、' respondsToSelector: 'ではなく、NSManagedObjectサブクラスにプロパティが存在することを確認しますか?データ移行が追加されたプロパティにアクセスしようとする前にエンティティサブクラスが作成された場合は、nilを返すか、認識できないセレクタ例外が発生しますか? – mashers

関連する問題