2009-08-03 22 views
6

データモデルのすべてのエンティティ/属性/関係をマッピングした後、すべてのマネージオブジェクトを作成しました。今、自分のエンティティ/クラスの1つを最初に設計したときに考えなかった追加の属性/関係を追加する必要があるという問題があります。既存のNSManagedObjectクラスをコアデータで変更して、すべてのモデルを消去し、新しいxcdatamodelに基づいて再作成する方法がありますか?コアデータのエンティティへの属性の追加

xcdatamodelの属性を追加すると、基本となるストレージメカニズムも更新されますか?永続的なストレージとしてSQLite3を使用している場合は、それに応じて列を追加しますか?

答えて

8

「xcdatamodelを変更し、生成されたコードからNSManagedObject派生クラスの既存のコードに変更をマージすることはできますか?」という場合、それは簡単です。変更されたモデルのコードを生成し、手動で変更をその特定の派生クラスにマージします。実際のところ、あなたの変更が真に付加的なものであれば、おそらくdiffとpatchを使って半自動的に行うことができます。

ただし、既存のストアを新しいスキーマに移行する必要がある場合は、先行する作業があります。これを強制するものではない特定の条件(直交エンティティの追加、プロパティの取得など)があります。既存の永続ストアを管理オブジェクトコンテキストの永続ストアコーディネータに追加する必要があるかどうかを認識します。

スキーマの変更を開始する前に、コアデータにmigrations and versioningを保存する必要があります。既存のストアがある場合は、常にそれを読んでください。これは、コアデータストアにユーザーデータが格納されているアプリでは、ほぼ確実です。また、自動インポートツールやデータストア生成ユーティリティを使用している場合を除いて、既存の静的ストアでも移行が必要になる可能性があります。

0

ジェネレーションギャップデザインのパターンも確認してください。それはまさにこの状況であなたを助けます。 Hereは、CoreDataで世代のギャップを使用することに関するSOの質問です。

9

あなたのデータモデルを複雑に変更するには、モデルのバージョンを作成し、古いモデルのデータを新しいモデルに移行する必要があります。 。舞台裏のSQLについて心配する必要はありませんが、Core Dataがそれを処理します。

しかし、単純なデータモデルの変更のために、AppleはコアデータのiPhone OS 3.0実装にlightweight migrationという新しい機能を導入しました。ライトワイト移行の場合、コアデータは、属性またはエンティティの名前の変更、属性の削除、既定値の属性の追加、またはエンティティの継承の変更など、データモデルの単純な変更を自動的に移行します。 NSMigratePersistentStoresAutomaticallyOptionおよびNSInferMappingModelAutomaticallyOptionオプションをonに設定していれば、コアデータは効率的な方法でデータの更新を処理します。たとえば、新しいバージョンの名前変更識別子を入力する必要があります。永続的なストア。

+2

私は[Core Data Migration and Versioning](http://www.timisted.net/blog/archive/core-data-migration/)がAppleのマニュアルに残っている空白をはっきりと埋めていることを発見しました。 Xcodeの 'デザイン>データモデル>モデルバージョンを追加 'は、私が行方不明だったステップでした。 –

+0

注:既存のオブジェクトの新しい属性に設定されているデフォルト値を取得するには、「オプション」フラグをオフにする必要があります。 – Klaas

+0

@ShaunInmanリンクは利用できません –

関連する問題