【问题标题】:How to add unique constraints for some fields in Core Data如何为 Core Data 中的某些字段添加唯一约束
【发布时间】:2014-02-03 12:13:06
【问题描述】:

我使用 Xcode 进行 iOS 开发。我有一些实体(例如,用户),我需要为他的名字设置唯一约束,但我无法通过可视化编辑器找到如何做到这一点。是否可以通过 GUI 来实现?还是只能通过代码?我很高兴能得到一些截图。

【问题讨论】:

    标签: ios core-data


    【解决方案1】:

    在 Core Data 的编辑器中选择实体时,侧边栏中会出现一个新部分。您可以设置要在实体的所有实例中唯一的约束条件

    为了在保存过程中自动解决冲突,您需要确保为托管对象上下文设置了merge policy,否则在保存时只会出现错误(这实际上可能是您想要的)

    [managedObjectContext setMergePolicy:NSMergeByPropertyObjectTrumpMergePolicy];
    

    “Swift 版本”一模一样

    managedObjectContext.mergePolicy = .mergeByPropertyObjectTrumpMergePolicyType
    

    请记住,冲突解决仅发生在保存期间,而不是插入期间。因此,如果您使用 NSFetchedResultsController,您将在插入实体时看到具有非唯一约束的实体。

    如果您想确保在托管对象上下文中没有具有非唯一约束的实体而不保存(如果您正在使用 FRC),this answer 可能仍然是最好的方法。不过,请记住,如果您执行大量插入操作会很昂贵,因为 NSFetchRequest 是昂贵的操作。

    可以在here找到此演示的示例代码

    【讨论】:

    • 我已在逗号分隔列表中添加了一个属性名称,但 git status 显示我的工作目录没有任何更改。
    • @ZacharyOrr 如果应用尝试插入具有“唯一”约束的列怎么办?肯定会失败。避免这种情况的最佳方法是什么?首先查询数据库以找到该记录?插入数据时是否可以使用“guard”语句(如果是 Swift)?
    • 请记住,必须仅为String 类型设置唯一约束。
    • 它不适合我。我在数据模型检查器中添加了约束,并将 NSMergeByPropertyStoreTrumpMergePolicy 设置为我的主上下文和临时上下文。我正在使用父/子上下文。我还设置了fetchRequest.returnsDistinctValues = true,然后使用 fetchedResultsController 执行请求。但我仍然无法避免添加重复数据并显示唯一数据。我尝试从模拟器中删除并重新安装应用程序。
    • 我可以做一个独特的约束,比如必须满足两个约束才能覆盖?例如:UserId 和 objectId 必须匹配,否则不会被覆盖?
    【解决方案2】:

    Swift 解决方案:

    如另一个答案中所述,您可以在 iOS9 及更高版本的 Core Data 中具有独特的约束。

    为此,首先从核心数据编辑器向实体添加约束(在 Zachary 的回答中进行了解释)。

    然后在代码中加入这一行:

    managedObjectContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy
    

    注意:在您执行managedObjectContext.save() 时检查唯一性,而不是在您将对象添加到托管对象时。

    NSMergeByPropertyObjectTrumpMergePolicy 只是合并策略之一,它用新值覆盖旧值。您可能需要查看文档以了解其他选项。

    【讨论】:

    【解决方案3】:

    swift 版本很简单 免责声明:如果您有冲突的信息,请在实施前删除。否则应用程序将无法运行。 解决方法从设备中删除并重新开始

    步骤是:

    1. 打开核心数据文件 (projectname.xcdatamodeld)
    2. 点击实体名称(需要突出显示)
    3. 屏幕右侧(在课堂部分)查找约束(点击加号按钮)
    4. 右键编辑信息重命名为属性。

    // 现在将代码添加到您的核心数据容器中

    1. 打开 AppDelegate.swift 文件并滚动到 coredata 堆栈(“// MARK: - Core Data Saving support”)
    2. 更新静态函数 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 {
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-23
      • 2021-04-01
      • 1970-01-01
      • 2018-05-28
      • 2022-07-27
      • 2017-05-05
      • 1970-01-01
      相关资源
      最近更新 更多