Ios 核心数据在更新旧对象时创建新对象

Ios 核心数据在更新旧对象时创建新对象,ios,swift,core-data,Ios,Swift,Core Data,首先,我不相信这是(它在Obj-C中,他们每次分离时都调用insertNewObject)的重复 背景信息:我从RayWenderlich的书中学习了如何使用CoreData,并在编写此代码时参考了它。如果你有这本书的话,我会按照第三章中的概述滚动我自己的自定义堆栈。如果需要,我可以显示此代码 队列是我试图更新的实体 它有1个属性:name-String 一对多关系:任务:任务 我的CoreData逻辑位于包含managedContext的结构中 我有一个基本的查找/创建函数来创建队列对象。这很

首先,我不相信这是(它在Obj-C中,他们每次分离时都调用insertNewObject)的重复

背景信息:我从RayWenderlich的书中学习了如何使用CoreData,并在编写此代码时参考了它。如果你有这本书的话,我会按照第三章中的概述滚动我自己的自定义堆栈。如果需要,我可以显示此代码

队列是我试图更新的实体

它有1个属性:name-String

一对多关系:任务:任务 我的CoreData逻辑位于包含managedContext的结构中

我有一个基本的查找/创建函数来创建队列对象。这很有效。它创建1个对象,并且仅创建1个对象

func findOrCreateMainQueue() -> Queue? {
    let queue = Queue(context: managedContext)
    queue.name = "Queue32"

    let queueFetch: NSFetchRequest<Queue> = Queue.fetchRequest()
    queueFetch.predicate = NSPredicate(format: "%K == %@", #keyPath(Queue.name), "Queue32" as CVarArg)
    do {
        let results = try managedContext.fetch(queueFetch)
        print(results.count)

        if results.count > 0 {
            return results.first!
        } else {
            try managedContext.save()
        }

    } catch let error as NSError {
        print("Fetch error: \(error) description: \(error.userInfo)")
    }

    return nil
}
为了节省空间,我不会为我尝试过的其他东西添加代码

  • 我尝试过使用find/create函数并在该方法中进行更新
  • 我尝试将队列保存为本地对象,并将其传递给addTask函数,这也会导致重复
  • 无论我是传入任务还是在addTask函数中创建一个任务,这都无关紧要
我开始相信我的问题是我的数据模型文件中的某些东西导致了这一点,因为我在网上尝试了许多“如何更新核心数据对象”教程,每次都得到了相同的结果

每当我尝试更新对象时,都会调用awakeFromInsert()。不确定这是否应该发生

在我的应用程序中的其他地方,更新工作正常。例如,如果我将子任务添加到任务中。它很好用。但是,如果要更改另一个名为Project的实体的名称,则对象将重复。(项目具有提取的id属性,然后更改name属性。)


先谢谢你。我已经花了好几个小时的时间了。

我承认我没有读过你所有的代码,但是如果你创建一个像这样的新托管对象

let queue = Queue(context: managedContext)
然后,它将被添加到
managedContext
,并在某个时间保存到磁盘。所以这个代码

if results.count > 0 {
    return results.first!
} else {
    try managedContext.save()
}
与先前创建的
队列
对象无关,因为即使
结果为0,也会保存该对象。计数
大于0,但稍后会保存。因此,这意味着您必须在获取成功时删除
队列
,这感觉不必要,最好等待创建它

if results.count > 0 {
    return results.first!
} else {
    let queue = Queue(context: managedContext)
    queue.name = "Queue32"
    try managedContext.save()
}

离题,但如果创建了新对象而不是获取了新对象,则返回nil,这是有意的吗?

非常感谢。我假设在函数未调用save()时,“queue”值已被删除。
if results.count > 0 {
    return results.first!
} else {
    try managedContext.save()
}
if results.count > 0 {
    return results.first!
} else {
    let queue = Queue(context: managedContext)
    queue.name = "Queue32"
    try managedContext.save()
}