我使用Xcode进行iOS开发。我有一些实体(例如,用户),我需要为他的名字设置唯一的约束,但我找不到如何通过可视化编辑器来做这件事。可以通过GUI来实现吗?还是只有通过代码才有可能?我会很高兴得到一些截图。
kcrjzv8t1#
在编辑器中为Core Data选择实体时,侧边栏中有一个新的部分。您可以设置希望在实体的所有示例中唯一的约束
为了在保存过程中自动解决冲突,您需要确保为托管对象上下文设置了merge policy,否则在保存时会出现错误(这可能正是您想要的)。
[managedObjectContext setMergePolicy:NSMergeByPropertyObjectTrumpMergePolicy];
“Swift版本”完全一样
managedObjectContext.mergePolicy = .mergeByPropertyObjectTrumpMergePolicyType
请记住,冲突解决只发生在保存期间,而不是插入期间。因此,如果您正在使用NSFetchedResultsController,您将在插入时看到具有非唯一约束的实体。
如果你想确保你的托管对象上下文中没有带有非唯一约束的实体而不保存(如果你使用FRC),this answer可能仍然是最好的方法。但是,请记住,如果您执行大量插入操作,那么它的开销会很大,因为NSFetchRequests是开销很大的操作。此演示的示例代码可以在here中找到
o8x7eapl2#
Swift解决方案:
正如在另一个答案中所指出的,您可以在iOS9的核心数据中有独特的约束。要做到这一点,首先从核心数据编辑器(Zachary的答案中解释)向实体添加约束。然后在代码中添加这一行:
managedObjectContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy
**注意:**唯一性检查是在执行managedObjectContext.save()时进行,而不是在向托管对象添加对象时进行。
managedObjectContext.save()
NSMergeByPropertyObjectTrumpMergePolicy只是合并策略之一,它会用新值覆盖旧值。您可能需要查看文档以了解其他选项。
NSMergeByPropertyObjectTrumpMergePolicy
93ze6v8z3#
swift版本很容易免责声明:如果您有冲突的信息,请删除执行的版本。否则应用程序将无法运行。解决方案从设备中删除并重新启动步骤为:1.打开核心数据文件(项目名称。xcdatamodeld)1.单击实体名称(需要突出显示)1.屏幕右侧(类部分)查找约束(点击加号按钮)1.右键单击可将信息重命名为“属性”。//现在将代码添加到核心数据容器中1.打开AppDelegate。swift文件并滚动到coredata堆栈(“// MARK:- 核心数据保存支持“)1.更新静态func saveContext(){ let variable = persistentContainer的代码。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 {
von4xj4u4#
环境:Swift 5,iOS 16。1、SwiftUI应用按照此answer在CoreData editor中进行更改。然后使用下面的代码设置合并策略:
CoreData editor
yourManagedObjectContext.mergePolicy = NSMergePolicy(merge: .mergeByPropertyObjectTrumpMergePolicyType)
4条答案
按热度按时间kcrjzv8t1#
在编辑器中为Core Data选择实体时,侧边栏中有一个新的部分。您可以设置希望在实体的所有示例中唯一的约束
为了在保存过程中自动解决冲突,您需要确保为托管对象上下文设置了merge policy,否则在保存时会出现错误(这可能正是您想要的)。
“Swift版本”完全一样
请记住,冲突解决只发生在保存期间,而不是插入期间。因此,如果您正在使用NSFetchedResultsController,您将在插入时看到具有非唯一约束的实体。
如果你想确保你的托管对象上下文中没有带有非唯一约束的实体而不保存(如果你使用FRC),this answer可能仍然是最好的方法。但是,请记住,如果您执行大量插入操作,那么它的开销会很大,因为NSFetchRequests是开销很大的操作。
此演示的示例代码可以在here中找到
o8x7eapl2#
Swift解决方案:
正如在另一个答案中所指出的,您可以在iOS9的核心数据中有独特的约束。
要做到这一点,首先从核心数据编辑器(Zachary的答案中解释)向实体添加约束。
然后在代码中添加这一行:
**注意:**唯一性检查是在执行
managedObjectContext.save()
时进行,而不是在向托管对象添加对象时进行。NSMergeByPropertyObjectTrumpMergePolicy
只是合并策略之一,它会用新值覆盖旧值。您可能需要查看文档以了解其他选项。93ze6v8z3#
swift版本很容易免责声明:如果您有冲突的信息,请删除执行的版本。否则应用程序将无法运行。解决方案从设备中删除并重新启动
步骤为:
1.打开核心数据文件(项目名称。xcdatamodeld)
1.单击实体名称(需要突出显示)
1.屏幕右侧(类部分)查找约束(点击加号按钮)
1.右键单击可将信息重命名为“属性”。
//现在将代码添加到核心数据容器中
1.打开AppDelegate。swift文件并滚动到coredata堆栈(“// MARK:- 核心数据保存支持“)
1.更新静态func saveContext(){ let variable = persistentContainer的代码。viewContext“
//现在进行这个简单的调用来管理更新过程
变量”.mergePolicy = NSMergeByPropertyObjectTrumpMergepolicy”
//清晰的理解
von4xj4u4#
环境:Swift 5,iOS 16。1、SwiftUI应用
按照此answer在
CoreData editor
中进行更改。然后使用下面的代码设置合并策略: