首先,我不相信这是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个对象。
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?
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“名称。
这是我尝试过的另一件事:
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)")
}
}
}
为了节省空间,我不会为我尝试过的其他东西添加代码。
我开始相信我的问题是由我的dataModel文件引起的,因为我在网上尝试了许多“如何更新核心数据对象”教程,每次都得到相同的结果。
每当我尝试更新对象时,都会调用awakeFromInsert()。不确定这是否应该发生。
在我的应用程序中的其他地方,更新是有效的。例如,如果我向Task添加子任务。它工作得很好。但是,如果我想更改另一个名为Project的实体的名称,该对象将复制。(项目有一个id属性,该属性被获取,然后name属性被更改。)
提前谢谢你。我都拖了好几个小时了。
https://stackoverflow.com/questions/56346353
复制相似问题