我知道核心数据的新功能是唯一的约束因此我决定测试它。我创建了简单的模式,当我为一个字段添加约束时(例如firstName) - 一切正常。如果我为另一个字段(lastName)添加约束 - 核心数据为每个字段单独创建两个不同的约束(我尝试添加两个字段逗号分隔在一行中,每个字段在单独的行中 - 没有区别)。但我想要组合firstName + lastName的唯一约束,是否可能?
感谢您的回复!
答案 0 :(得分:9)
可以为属性组合设置唯一性约束。您在正确的路径上将两个属性放在约束中的同一行:
您可能发现由于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模拟器;我没有检查过以前的版本。)
答案 1 :(得分:3)
在模型编辑器中设置约束时,似乎Xcode在运行时持久更改磁盘的典型行为并不适用。 (Xcode 7.3,在我的情况下。)
解决方案?再次假装它的1990年,并在更改约束后点击⌘-S
。