Ios 如何为核心数据中的某些字段添加唯一约束
我使用Xcode进行iOS开发。我有一些实体(例如,用户),我需要为他的名字设置唯一的约束,但我找不到如何通过可视化编辑器来实现。有可能通过GUI来实现吗?或者只通过代码就可以了?我很乐意得到一些屏幕截图。在编辑器中为核心数据选择实体时,侧边栏中有一个新的部分。可以设置要在实体的所有实例中唯一的约束 为了在保存过程中自动解决冲突,您需要确保为托管对象上下文设置了一个集合,否则在保存时只会出现错误(这可能是您真正想要的) “Swift版本”完全相同Ios 如何为核心数据中的某些字段添加唯一约束,ios,core-data,Ios,Core Data,我使用Xcode进行iOS开发。我有一些实体(例如,用户),我需要为他的名字设置唯一的约束,但我找不到如何通过可视化编辑器来实现。有可能通过GUI来实现吗?或者只通过代码就可以了?我很乐意得到一些屏幕截图。在编辑器中为核心数据选择实体时,侧边栏中有一个新的部分。可以设置要在实体的所有实例中唯一的约束 为了在保存过程中自动解决冲突,您需要确保为托管对象上下文设置了一个集合,否则在保存时只会出现错误(这可能是您真正想要的) “Swift版本”完全相同 managedObjectContext.me
managedObjectContext.mergePolicy = .mergeByPropertyObjectTrumpMergePolicyType
请记住,冲突解决仅发生在保存过程中,而不是插入过程中。因此,如果您使用NSFetchedResultsController,则在插入实体时,您将看到具有非唯一约束的实体
如果要确保在托管对象上下文中没有具有非唯一约束的实体而不进行保存(如果使用FRC),这可能仍然是最好的方法。不过,请记住,如果要进行大量插入,那么代价会很高,因为nsfetchrequest是昂贵的操作
此演示的示例代码可以在Swift解决方案中找到: 正如在另一个答案中所指出的,对于iOS9以后的版本,您可以在核心数据中有唯一的约束 为此,首先从核心数据编辑器向实体添加约束(在Zachary的回答中进行了解释) 然后在代码中添加此行:
managedObjectContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy
注意:在执行managedObjectContext.save()操作时检查唯一性,而不是在向托管对象添加对象时检查唯一性
nsmergeByPropertyObject TrumpMergePolicy
只是合并策略之一,它用新值覆盖旧值。您可能需要查看文档中的其他选项。swift版本很简单
免责声明:如果您有冲突的信息,请删除PIR以执行。否则应用程序将不会运行。
解决方案从设备中删除并重新启动
步骤如下:
打开核心数据文件(projectname.xcdatamodeld)
单击实体名称(需要突出显示)
屏幕右侧(课堂部分)查找约束(点击加号按钮)
右键单击可编辑信息重命名为属性
//现在将代码添加到核心数据容器中
打开AppDelegate.swift文件并滚动到coredata堆栈(“//标记:-核心数据保存支持”)
更新静态func saveContext()的代码{let variable=persistentcainer.viewContext“
//现在进行这个管理更新过程的简单调用
变量“.mergePolicy=NSMergeByPropertyObjectTrumpMergePolicy”
//明白
static func saveContext () {
let context = persistentContainer.viewContext
context.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy
// you need that line
if context.hasChanges {
do {
try context.save()
} catch {
我已将属性名称添加到逗号分隔的列表中,但git status显示我的工作目录未做任何更改。@ZacharyOrr如果应用程序尝试插入具有“唯一”约束的列,该怎么办?肯定会失败。避免这种情况的最佳方法是什么?首先查询数据库以查找该记录?是否可以使用“保护”命令“声明(如Swift)插入数据时?请记住,必须仅为String
类型设置唯一约束。这对我不起作用。我在数据模型检查器中添加了约束,还将NSMergeByPropertyStoreTranpMergePolicy设置为我的主上下文和临时上下文。我使用的是父/子上下文。我还设置了fetchRequest.returnsDistinctValues=true
然后使用fetchedResultsController执行请求。但我仍然无法避免添加重复数据和显示唯一数据。我尝试从模拟器中删除并重新安装应用程序。我是否可以设置唯一约束,例如,必须满足这两个约束才能覆盖?例如:UserId&objectId must match,否则它不会被覆盖?如果记录已经存在,这不会显示错误,如何使用错误改进UX?UX中的UX是否要告诉用户某些重复?可能使用NSErrorMergePolicy。捕获返回值,然后执行自定义逻辑。
static func saveContext () {
let context = persistentContainer.viewContext
context.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy
// you need that line
if context.hasChanges {
do {
try context.save()
} catch {