2015-11-14 10 views
6

So che la nuova funzionalità dei dati di base è vincoli univoci, quindi decido di testarla. Ho creato uno schema semplice e quando aggiungo un vincolo per un campo (firstName per esempio) - tutto funziona. Se aggiungo un vincolo per un altro campo (lastName) - i dati di base creano due diversi vincoli per ogni campo singolarmente (ho provato ad aggiungere due campi separati da virgola in una riga e ogni campo in una riga separata - nessuna differenza). Ma voglio un vincolo univoco per la combinazione firstName + lastName, è possibile?dati di base ios9: vincolo unico multifield

Grazie per la risposta!

risposta

5

È 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:

Data Model Editor snapshot

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).

+0

Purtroppo, questo bug esiste ancora in Xcode 8 oggi. Mi è appena successo. Incredibile. –

0

I vincoli di tipo composito o multi-campo non sono supportati. Al momento è possibile aggiungere solo vincoli per singoli campi.

+0

Grazie! Questo è molto triste. Spero che Apple aggiunga questa funzionalità essenziale in futuro. – Anton

3

Sembra che il comportamento tipico di Xcode delle modifiche persistenti sul disco in Esecuzione non si applichi quando si impostano i vincoli nell'editor del modello. (Xcode 7.3, nel mio caso.)

Soluzione? Fai finta di nuovo il 1990 e colpisci ⌘-S dopo aver modificato i vincoli.

Problemi correlati