首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >核心数据在更新旧对象时创建新对象

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

Stack Overflow用户
提问于 2019-05-29 00:15:35
回答 1查看 59关注 0票数 0

首先,我不相信这是Updating object value in core data is also creating a new object的复制品(它是在Obj-C中的,他们每次调用insertNewObject时都会调用它)。

背景信息:我从Ray Wenderlich这本书中学习了如何使用CoreData,并在编写此代码时参考了它。如果你有这本书,我在第三章中介绍了我自己的自定义堆栈。如果需要,我可以展示代码。

Queue是我试图更新的实体。

它有一个属性: name - String

和一对多关系:任务:任务

我的CoreData逻辑在一个包含managedContext的结构中。

我有一个基本的find/create函数来创建一个队列对象。这是可行的。它创建1个且仅创建1个对象。

代码语言:javascript
复制
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
}

(从queue.name后缀编号可以看出,我尝试了很多不同的方法。)

我已经尝试了我能想到的所有方法:

此代码基本上是从以下位置复制/粘贴的:How do you update a CoreData entry that has already been saved in Swift?

代码语言:javascript
复制
func addTaskToMainQueue2(task: Task) {
    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 {

            var tasks = results[0].tasks?.mutableCopy() as? NSMutableOrderedSet
            tasks?.add(task)
            results[0].setValue(tasks, forKey: "tasks")
        }

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

        do {
            try managedContext.save()
        } catch let error as NSError {
            print("Save error: \(error),description: \(error.localizedDescription)")
        }


}

这使得第二队列对象被创建为具有"Queue32“名称。

这是我尝试过的另一件事:

代码语言:javascript
复制
func addTaskToMainQueue(task: Task) {
    if var queue = findOrCreateMainQueue() {
        var tasks = queue.tasks?.mutableCopy() as? NSMutableOrderedSet
        tasks?.add(task)
        queue.tasks = tasks
        do {
            try managedContext.save()
        } catch let error as NSError {
            print("Save error: \(error),description: \(error.localizedDescription)")
        }

    }
}

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

  • 我尝试过使用查找/创建函数,并在该方法中进行更新。
  • 我尝试将队列保存为本地对象,并将其传递给addTask函数,这也会导致重复。
  • 我传入任务还是在addTask函数中创建任务也无关紧要。

我开始相信我的问题是由我的dataModel文件引起的,因为我在网上尝试了许多“如何更新核心数据对象”教程,每次都得到相同的结果。

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

在我的应用程序中的其他地方,更新是有效的。例如,如果我向Task添加子任务。它工作得很好。但是,如果我想更改另一个名为Project的实体的名称,该对象将复制。(项目有一个id属性,该属性被获取,然后name属性被更改。)

提前谢谢你。我都拖了好几个小时了。

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56346353

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档