如何管理临时保存的CoreData? 一旦我做了这样的事情:
var myClass: MyClass = NSEntityDescription.insertNewObjectForEntityForName("MyClass", inManagedObjectContext: (UIApplication.sharedApplication().delegate as AppDelegate).managedObjectContext!) as MyClass
它是我的managedObjectContext的一部分,当我执行context.save(nil)
时将保存它
有没有办法获取NSManagedObject类的对象而不会弄乱我当前的上下文。
换句话说:我希望有一些可选的对象,当我没有明确地保存它们时,这些对象最终未被使用,我希望拥有我真正想要永久保存的对象。
答案 0 :(得分:2)
没有直接的方法你可以摆脱更新的对象,你可以做的是用真实数据(更新前的先前数据)再次更新它。无论何时更新'NSManagedObject'(核心数据实体对象)的对象,'NSManagedObjectContext'都会捕获所有更改,并在保存上下文时保存。
在这种用例中更好地使用Sqlite数据库。
答案 1 :(得分:1)
这个答案很晚,但希望能帮助其他人。 是的。您创建了一个子上下文。做你想做的任何事。如果 您希望保留更改,保存子上下文 - 这不会保留数据。它通知父上下文的更改,更改现在在您的主要上下文中。然后,您可以在主要上下文中执行保存。
let childContext = NSManagedObjectContext(concurrencyType: .MainQueueConcurrencyType)
childContext.parentContext = mainContext
guard let myClass = NSEntityDescription.insertNewObjectForEntityForName("MyClass", inManagedObjectContext: childContext) as? MyClass else {
// something went wrong, handle it here
return
}
// do your thing here
让主要上下文知道您要保留更改:
do {
try childContext.save() // does not persist anything, just lets know the parent that we are happy with the changes
} catch {
// handle error
}
如果您不想保留更改,可以重置:
childContext.reset()
如果您希望在主要上下文中保留更改,请执行以下操作:
do {
try mainContext.save()
} catch {
// handle error
}
答案 2 :(得分:0)
您可以在调用context.save
之前从托管上下文中删除对象,这会阻止它们被提交。假设您有一个名为NSManagedObjectContext
的{{1}}和一个名为context
的{{1}}实例,则以下内容将有效:
MyClass
请参阅:
NSManagedObjectContext.deleteObject
<强>讨论强>
...如果对象尚未保存到持久性存储中,则只需将其从接收方中删除。
当然,关于保存哪些对象以及丢弃哪些对象的决定取决于应用程序的逻辑。因此,在调用save之前,需要检查所有已插入但尚未提交的实例,这些实例是使用您正在使用的NSManagedObjectContext注册的。您可以在应用程序中跟踪它,或者这可能是有用的:
NSManagedObjectContext.insertedObjects
已插入接收器但尚未保存在持久存储中的对象集。 (只读)