È possibile impostare i vincoli di unicità per una combinazione di attributi. Tu eri sulla strada giusta mettendo entrambi gli attributi sulla stessa linea dei vincoli:
Potresti aver trovato questo non ha avuto effetto a causa di un problema con Xcode: i vincoli non sono effettivamente aggiornati nel modello a meno che non modifichiate altri aspetti del modello nello stesso momento (ad esempio, modificate un tipo di attributo e quindi modificatelo di nuovo).
Se si guarda il codice SQL generato, la tabella viene creata con un vincolo:
CREATE TABLE ZSTOREOBJECT (Z_PK INTEGER PRIMARY KEY, Z_ENT INTEGER, Z_OPT INTEGER, ...., CONSTRAINT ZLASTNAME_ZFIRSTNAME UNIQUE (ZLASTNAME, ZFIRSTNAME))
e quando si inserisce nuovo inserto nuovi valori che non riescono questo vincolo (quando il contesto è salvato):
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
e l'errore restituito è:
Error Domain=NSCocoaErrorDomain Code=133021 "(null)" UserInfo={conflictList=(
"NSConstraintConflict (0x7fbd18d33c10) for constraint (\n lastName,\n firstName\n): ....
(questo funziona in Xcode 7.2. 1, con il simulatore iOS9.2; Non ho controllato le versioni precedenti).
Purtroppo, questo bug esiste ancora in Xcode 8 oggi. Mi è appena successo. Incredibile. –