2014-01-15 12 views
30

私はiOS開発の新人です。開発にはXCode 5.02を使用します。私はいくつかのエンティティ(例えば、User)を持っていて、彼の名前にユニークな制約を設定する必要がありますが、ビジュアルエディタを使ってどのように行うことができません。それはGUIを介して行うことは可能ですか?それともコードだけで可能ですか?進歩をありがとう。可能であれば、私はいくつかのスクリーンショットを取得することがうれしいです。コアデータの一部のフィールドに固有の制約を追加する方法

答えて

66

これはiOS 9で実際に変更されました。アップルは、エンティティに一意の制約を追加する機能を追加しました。私はa blog postこのセットアップを得る方法を説明書を書いた。


TL;コアデータのエディタでエンティティを選択するとき、DRは、サイドバーの新しいセクションがあります。あなたが節約時に自動競合解決のためのエンティティ

のすべてのインスタンス全体で一意になりたい何の制約(複数可)を設定することができ、あなたは、マージポリシーセットを持っていることを確認する必要があります管理対象オブジェクトコンテキストのためか、他

_managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType]; 
[_managedObjectContext setMergePolicy:NSMergeByPropertyObjectTrumpMergePolicy]; 

が挿入セーブ中にのみ起こる心の紛争解決に保ち、そしてません(実際にあなたが望むものであるかもしれない)保存するときに、あなただけのエラーを取得します。したがって、NSFetchedResultsControllerを使用している場合は、挿入されるときに一意ではない制約を持つエンティティが表示されます。

enter image description here

あなたは(あなたがFRCを利用している場合)、保存せずに、あなたの管理オブジェクトコンテキスト内の非一意性制約とは実体を持たないことを確認したい場合は、this answerはおそらくまだするための最良の方法です行く。 NSFetchRequestsは高価な操作なので、たくさんの挿入をしていると高価です。

+0

Zachary Orr:あなたのブログの投稿リンクは、この同じページを指しています... –

+0

おっと!固定。.. –

+0

コンマ区切りのリストにプロパティ名を追加しましたが、git statusに自分の作業ディレクトリの変更が行われていないと表示されます。 – Skyler

9

スウィフトソリューション:

他の回答で述べたように、あなたが以降iOS9のためにコアデータでユニーク制約を持つことができます。

これを行うには、まずコアデータエディタからEntityに制約を追加します(Zacharyの答えの説明)。

その後のコードに次の行を追加します。

managedObjectContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy 

注:あなただけの管理対象オブジェクトにオブジェクトを追加している間、あなたはmanagedObjectContext.save()しないとき一意性がチェックされています。

NSMergeByPropertyObjectTrumpMergePolicyは、古い値を新しいポリシーで上書きするマージポリシーの1つに過ぎません。その他のオプションについては、ドキュメンテーションを参照してください。

関連する問題