核心数据实体唯一约束不起作用

2024-03-29

我正在尝试使用新的实体约束检查器在核心数据中设置约束(以使项目的名称唯一)。我读过的所有内容都表明这非常简单 - 设置约束并处理错误。我没有收到任何错误,并且可以根据需要多次添加相同的条目。

该应用程序确实需要 IOS 9.0,Xcode 工具要求设置为 7.0

约束category1Name 是一个字符串。

我的 addItem 代码是:

func addNewRecord() {

    //check to be sure the entry is not empty
    if (categoryTextField.text == "") {

        //prompt requiring a name
        let ac = UIAlertController(title: nil, message: "Name Required", preferredStyle: .Alert)
        ac.addAction(UIAlertAction(title: "Ok", style: .Default, handler: nil))
        self.presentViewController(ac, animated: true, completion: nil)

    } else {

    let newManagedObject = NSEntityDescription.insertNewObjectForEntityForName("Category1", inManagedObjectContext: kAppDelegate.managedObjectContext) as! Category1

    newManagedObject.category1Name = categoryTextField.text
    newManagedObject.category1Description = categoryTextView.text

    //bunch more items...

    //save it
    kAppDelegate.saveContext()
    makeEntryFieldsEnabledNO()
    performSegueWithIdentifier("unwindToCategoriesTableViewController", sender: self)

    }//if  else

}//addNewRecord

AppDelegate 保存是标准的:

func saveContext () {
    if managedObjectContext.hasChanges {
        do {
            try managedObjectContext.save()
        } catch {

            //insert your standard error alert stuff here
            let nserror = error as NSError
            print("From the print line: Unresolved error \(nserror), \(nserror.userInfo)")

            abort()
        }//do catch
    }//if moc
}//saveContext

这是核心数据约束:

此应用程序已启用 iCloud。

ManagedObjectContext 合并策略设置为 NSMergeByPropertyObjectTrumpMergePolicy

lazy var managedObjectContext: NSManagedObjectContext = {
    // Returns the managed object context for the application (which is already bound to the persistent store coordinator for the application.) This property is optional since there are legitimate error conditions that could cause the creation of the context to fail.
    let coordinator = self.persistentStoreCoordinator
    var managedObjectContext = NSManagedObjectContext(concurrencyType: .MainQueueConcurrencyType)
    managedObjectContext.persistentStoreCoordinator = coordinator
    managedObjectContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy
    return managedObjectContext

}()//var managedObjectContext

任何指导将不胜感激。


Apple 似乎终于解决了 Xcode 的疯狂问题,即您在数据模型文件中所做的更改实际上并没有改变。

抛开这一点,当前的公式似乎是:

在你的核心数据单例中......

    container = NSPersistentContainer(name: _nom)
    
    // during development, right HERE likely delete the sql database file
    // and start fresh, as described here stackoverflow.com/a/60040554/294884
    
    container.loadPersistentStores { storeDescription, error in
        if let error = error {
            print("\n ERROR LOADING STORES! \(error) \n")
        }
        else {
            print("\n  STORES LOADED! \(storeDescription) \n")
        }
    
        self.container.viewContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy
        self.container.viewContext.automaticallyMergesChangesFromParent = true
    }

您必须使用合并策略and自动合并。

然后在你的数据模型文件中

  1. 不要打扰,除非每段关系都有一个inverse, with
  2. “对一个或多个”正确设置
  3. 并且(几乎可以肯定,除了非常不寻常的源数据)每个实体的唯一 ID 被指示为约束

然后当你添加新数据时,你必须

  1. 使用新的背景上下文受供于方便的核心数据函数可以做到这一点
  2. so, 永远不要尝试创建自己的单独线程
  3. 仔细检查您是否已完成 (1) 和 (2)!
  4. 当您添加一些实体时,您必须这样做inside a perform
  5. 当您完成添加实体(即在新线程上)时,您必须还在表演的时候 ...
  6. 做一个 PerformAndWait 做两件事
  7. 保存新项目(在新child线程),然后
  8. 保存新项目(在主视图 thread)
  9. 当然,对于 7 和 8,您必须在保存之前检查 .hasChanges

容易吧?

所以像

let pm = core.container.newBackgroundContext()
pm.perform {
    for onePerson in someNewData {
        ... create your new CDPerson entity ...
    }
    pm.bake()
}

请注意,烘焙例程位于执行块内,

它看起来像这样:

func bake() {
    self.performAndWait {
        if self.hasChanges {
            do {
                try self.save()
            }
            catch {
                print("bake disaster type 1 \(error)")
            }
        }
        
        // OPTIONALLY, SEE BELOW
        if core.container.viewContext.hasChanges {
            do {
                try core.container.viewContext.save()
            }
            catch {
                print("bake disaster type 2 \(error)")
            }
        }
        // OPTIONALLY, SEE BELOW
    }
}

为了清楚起见,请注意pm.bake...在函数中bake(), the self上半场确实是这样newBackgroundContext它是为执行内的循环创建的。

请注意,这些天你甚至不需要保存到主上下文

如今automaticallyMergesChangesFromParent如果您“执行上面长列表中的所有操作”,似乎工作得很好。

• 在上面的烘焙中,添加几行打印行以查看保存到viewContext 中的内容。你会看到一切都没有被拯救。这一切都是由子/引擎中的任何关系正确完成的

• 事实上,实际上您可以省略该代码段​​。你所要做的就是

func bake() {
    self.performAndWait {
        if self.hasChanges {
            do {
                try self.save()
            }
            catch {
                print("bake disaster type 1 \(error)")
            }
        }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

核心数据实体唯一约束不起作用 的相关文章

随机推荐

  • 基于父子类的视图中的分层菜单

    我有一个视图模型 public class Page public int Id get set public Page Parent get set public string Name get set public string Tit
  • ASPNET 5 MVC 6 中的远程验证

    在 aspnet 5 中找不到 JsonRequestBehavior 我正在尝试实现远程验证演示 但 Microsoft AspNet Mvc 似乎不包含 JsonRequestBehavior 枚举 但在以前版本的 MVC 中 它确实存
  • 从 CLR 存储过程中访问 Sql FILESTREAM

    我正在尝试从 CLR 存储过程访问 Sql 文件流 我已经设置了一个非常简单的数据库 其中包含一个包含文件流列的表 我可以使用简单的控制台应用程序成功地从文件流中读取数据 以下是失败的过程的一些示例代码 SqlProcedure publi
  • 单击鼠标更改 Knockout.js 中的 css 类

    Knockout js 文档显示了这样的 css 绑定 div Profit Information div 我需要对其进行调整以更改鼠标单击时的 css 类 我怎样才能做到这一点 根据下面的答案 我正在使用这样的代码 CSS class
  • Java内存不足错误(本机内存),达到进程大小限制(32位linux)

    我正在测试 Web 应用程序的性能 并收到 内存不足错误 本机内存 我测试了好几次 每次都是 无法为 Chunk new 分配 83886088 字节 并死掉 我每分钟打印一次内存大小 发现进程死亡前VmSize为2924700 kB 我认
  • 在Python中读取.dss数据库文件

    我有一个 DSS 数据库文件 我想使用 Python 从该文件中提取数据库架构 我实际上需要对此数据库执行查询 但我找不到任何好的文档来开始 所以 我决定如果我可以提取模式 我可以创建一个 SQLite 数据库并在那里运行我的实验 文件内容
  • Web API 2 返回 OK 响应但继续在后台处理

    我已经为 shopify 创建了一个 mvc web api 2 webhook public class ShopifyController ApiController PUT api Afilliate SaveOrder Respon
  • 单击外部时防止日期选择器关闭[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在使用 jquery datepicker 我想在单击日历对话框外部时阻止关闭功能 url http jqueryui com dat
  • 禁用下拉菜单中的选项 Unity

    I need to disable 1 or 2 dropdown option from a dropdown menu in Unity The dropdown menu should not be repopulated There
  • R、正确使用粘贴功能

    该循环正确创建了 13 个名为 bond1 bond13 的 df 并为它们分配了 function1 中的值 现在我需要使用 function2 和另外两个 df 创建另外 13 个名为 spread1 spread13 的 DF 其中之
  • 如何使用 PHP 检测访问我们网站的用户的 MAC 地址?

    我知道如何追踪 IP 地址 但我需要追踪查看我的页面的用户的 MAC 地址 如何做到这一点 除非用户与网络服务器位于同一 LAN 上 否则无法执行此操作 MAC 地址位于 TCP IP 下面的以太网层 并且不包含在从用户本地网络路由出去的
  • 为什么 SQL Server 2008 在长事务 INSERT 上阻止 SELECT?

    我们正在尝试建立一个只定期插入新记录的事务表 这个简单的表需要我们随着时间的推移不断向其中添加新记录 该表中的事务量预计会相当高 并且可能会定期批量导入事务 gt 1000 这可能需要几秒钟才能完成 然后 我们根据这些数据执行一组选择语句
  • 你能在 vim 中做交互式宏或录音吗?

    我想定义一个 vim 宏 在特定时间中断用户输入 这可能吗 编辑 原来是我的录音 q 而不是宏 可以在录音中使用输入命令 但麻烦大于其价值 我首先将插入输入转义映射到一个键 map
  • Visual Studio Code:如何同时打开调试窗口和资源管理器窗口?

    我是视觉代码新手 我有一个小问题 您有两个用红线圈出的按钮 第一个按钮打开资源管理器窗口 第二个圆圈按钮打开调试窗口 我想打开这两个窗口 你知道该怎么做吗 从 VSCode 1 13 开始这是不可能的 已跟踪显示多个面板的功能请求here
  • 使用TDD在Java中开发文件遍历代码

    我必须实现一些代码来遍历目录结构并返回找到的文件列表 要求非常简单 给定一个基本目录 查找其中的所有文件 不是目录本身 如果找到目录 请重复步骤 1 我想使用 TDD 开发代码 当我开始编写测试时 我意识到我在嘲笑班级File 这样我就可以
  • PHP 致命错误:内存不足(已分配 80740352)(试图分配 12352 字节)

    当用户在我的网站上上传图像时 我收到此错误 错误消息是 PHP 致命错误 home 内存不足 已分配 80740352 试图分配 12352 字节 如何使用 php ini 修复此问题 这是我当前的上传 php ini 设置 upload
  • 对 .toolbarBackground SwiftUI 使用渐变

    我正在尝试为导航 toolbarBackground 设置自定义渐变 但任何时候我都只使用 LinearGradient 中的第一种颜色运行它 toolbar ToolbarItem placement navigationBarTrail
  • 在 React Native 地图中设置最大和最小缩放级别

    如何在 React Native 地图中设置最小和最大缩放级别
  • 如何从 EditText 中仅获取可见文本

    我有一个用于在 Android 上运行的代码编辑器的 EditText 我正在对内容应用语法突出显示 除了 EditText 滚动到屏幕之外的大字符串之外 它运行良好 每次按键时语法突出显示都会应用于整个 Spannable 有谁知道我如何
  • 核心数据实体唯一约束不起作用

    我正在尝试使用新的实体约束检查器在核心数据中设置约束 以使项目的名称唯一 我读过的所有内容都表明这非常简单 设置约束并处理错误 我没有收到任何错误 并且可以根据需要多次添加相同的条目 该应用程序确实需要 IOS 9 0 Xcode 工具要求