【发布时间】:2014-02-03 12:13:06
【问题描述】:
我使用 Xcode 进行 iOS 开发。我有一些实体(例如,用户),我需要为他的名字设置唯一约束,但我无法通过可视化编辑器找到如何做到这一点。是否可以通过 GUI 来实现?还是只能通过代码?我很高兴能得到一些截图。
【问题讨论】:
我使用 Xcode 进行 iOS 开发。我有一些实体(例如,用户),我需要为他的名字设置唯一约束,但我无法通过可视化编辑器找到如何做到这一点。是否可以通过 GUI 来实现?还是只能通过代码?我很高兴能得到一些截图。
【问题讨论】:
在 Core Data 的编辑器中选择实体时,侧边栏中会出现一个新部分。您可以设置要在实体的所有实例中唯一的约束条件
为了在保存过程中自动解决冲突,您需要确保为托管对象上下文设置了merge policy,否则在保存时只会出现错误(这实际上可能是您想要的)
[managedObjectContext setMergePolicy:NSMergeByPropertyObjectTrumpMergePolicy];
“Swift 版本”一模一样
managedObjectContext.mergePolicy = .mergeByPropertyObjectTrumpMergePolicyType
请记住,冲突解决仅发生在保存期间,而不是插入期间。因此,如果您使用 NSFetchedResultsController,您将在插入实体时看到具有非唯一约束的实体。
如果您想确保在托管对象上下文中没有具有非唯一约束的实体而不保存(如果您正在使用 FRC),this answer 可能仍然是最好的方法。不过,请记住,如果您执行大量插入操作会很昂贵,因为 NSFetchRequest 是昂贵的操作。
可以在here找到此演示的示例代码
【讨论】:
String 类型设置唯一约束。
fetchRequest.returnsDistinctValues = true,然后使用 fetchedResultsController 执行请求。但我仍然无法避免添加重复数据并显示唯一数据。我尝试从模拟器中删除并重新安装应用程序。
Swift 解决方案:
如另一个答案中所述,您可以在 iOS9 及更高版本的 Core Data 中具有独特的约束。
为此,首先从核心数据编辑器向实体添加约束(在 Zachary 的回答中进行了解释)。
然后在代码中加入这一行:
managedObjectContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy
注意:在您执行managedObjectContext.save() 时检查唯一性,而不是在您将对象添加到托管对象时。
NSMergeByPropertyObjectTrumpMergePolicy 只是合并策略之一,它用新值覆盖旧值。您可能需要查看文档以了解其他选项。
【讨论】:
swift 版本很简单 免责声明:如果您有冲突的信息,请在实施前删除。否则应用程序将无法运行。 解决方法从设备中删除并重新开始
步骤是:
// 现在将代码添加到您的核心数据容器中
//现在进行这个简单的调用来管理更新过程
变量“.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy”
//清晰的理解
static func saveContext () {
let context = persistentContainer.viewContext
context.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy
// you need that line
if context.hasChanges {
do {
try context.save()
} catch {
【讨论】: