核心数据ios9:多字段唯一约束

时间:2015-11-14 23:21:31

标签: ios core-data

我知道核心数据的新功能是唯一的约束因此我决定测试它。我创建了简单的模式,当我为一个字段添加约束时(例如firstName) - 一切正常。如果我为另一个字段(lastName)添加约束 - 核心数据为每个字段单独创建两个不同的约束(我尝试添加两个字段逗号分隔在一行中,每个字段在单独的行中 - 没有区别)。但我想要组合firstName + lastName的唯一约束,是否可能?

感谢您的回复!

2 个答案:

答案 0 :(得分:9)

可以为属性组合设置唯一性约束。您在正确的路径上将两个属性放在约束中的同一行:

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模拟器;我没有检查过以前的版本。)

答案 1 :(得分:3)

在模型编辑器中设置约束时,似乎Xcode在运行时持久更改磁盘的典型行为并不适用。 (Xcode 7.3,在我的情况下。)

解决方案?再次假装它的1990年,并在更改约束后点击⌘-S