2015-11-14 2 views
6

コアデータの新機能はユニークな制約であることがわかっていますので、テストします。私は単純なスキーマを作成し、1つのフィールド(firstNameなど)の制約を追加すると、すべて動作します。別のフィールド(lastName)の制約を追加すると、コアデータによって各フィールドごとに2つの異なる制約が作成されます(2つのフィールドを1行に区切り、各フィールドを別々の行に区切ります)。しかし、firstName + lastNameの組み合わせには一意の制約が必要ですが、それは可能ですか?コアデータios9:マルチフィールドユニーク制約

ありがとうございました!

答えて

5

属性の組み合わせに対して一意性制約を設定することは可能です。あなたが制約に同じ行に両方の属性を置く正しい道の上にいた:

Data Model Editor snapshot

あなたは、これが原因のXcodeでの問題に影響を与えなかった発見したことがあります。制約は、実際にモデルに更新されません(例えば、属性タイプを変更してからそれを元に戻すなど)、モデルの他の側面を同時に変更しない限り、変更することはできません。

あなたが生成されるSQLを見てみると、表の制約を使用して作成されます

CREATE TABLE ZSTOREOBJECT (Z_PK INTEGER PRIMARY KEY, Z_ENT INTEGER, Z_OPT INTEGER, ...., CONSTRAINT ZLASTNAME_ZFIRSTNAME UNIQUE (ZLASTNAME, ZFIRSTNAME)) 

、あなたは(コンテキストが保存されている)、この制約を失敗し、新たな挿入、新しい値を挿入:

CoreData: sql: COMMIT 
CoreData: sql: BEGIN EXCLUSIVE 
CoreData: sql: INSERT INTO ZSTOREOBJECT(Z_PK, Z_ENT, Z_OPT) VALUES(?, ?, ?) 
CoreData: sql: UPDATE ZSTOREOBJECT SET ZLASTNAME = ?, ZFIRSTNAME = ? WHERE Z_PK = ? 
CoreData: sql: ROLLBACK 

とエラーが返さは、次のとおりです。

Error Domain=NSCocoaErrorDomain Code=133021 "(null)" UserInfo={conflictList=(
"NSConstraintConflict (0x7fbd18d33c10) for constraint (\n lastName,\n firstName\n): .... 

(これはXcodeの7.2で動作します。 1、iOS9.2シミュレータ私は以前のバージョンをチェックしていない)。

+0

悲しいことに、このバグは今日でもXcode 8にはまだ存在しています。ちょうど私に起こった。信じられない。 –

0

複合制約または複数フィールド制約は、には対応していません。現時点では、単一のフィールドに対してのみ制約を追加できます。

+0

ありがとうございました!これは非常に悲しいです。希望、リンゴは将来この重要な機能を追加します。 – Anton

3

モデルエディタで制約を設定すると、Xcodeの一般的な実行時の変更がディスクに反映されないように見えます。 (私の場合、Xcode 7.3)

解決策?それが再び1990年代になり、制約を変更した後に⌘-Sを打ってください。