我如何从Core Data的持久存储中删除所有对象?
我如何从Core Data的持久存储中删除所有对象?
我在我的应用程序中使用了核心数据。因此,我获取一个XML文件,将数据解析成模型对象并将其插入到核心数据中。它们保存在持久存储中,我可以在重新启动应用程序时访问它们。然而,我希望能够随时刷新持久存储中的数据,因此需要首先从存储中删除现有对象。是否有一种简单直接的方法可以做到这一点?
谢谢
我找到了以下解决方案:
[managedObjectContext lock]; [managedObjectContext reset];//放弃未决的更改 if ([persistentStoreCoordinator removePersistentStore:persistentStore error:&error]) { NSURL* storeURL = [NSURL fileURLWithPath:[self pathForPersistentStore]]; [[NSFileManager defaultManager] removeFileAtPath:[storeURL path] handler:nil]; [self addPersistentStore];//重新创建持久存储 } [managedObjectContext unlock];
问题的出现原因:用户想要从Core Data的持久化存储中删除所有对象。
解决方法:根据Manzini的回答,用户可以使用以下Swift 2.1版本的代码来实现删除功能。代码中使用了一个扩展NSManagedObjectContext
,其中包含了一个deleteAllData()
方法。该方法首先获取持久化存储的URL,然后通过调用reset()
方法重置上下文,接着尝试删除持久化存储并删除文件,最后重新添加持久化存储。
整个解决方法的代码如下:
import Foundation
import CoreData
extension NSManagedObjectContext
{
func deleteAllData()
{
guard let persistentStore = persistentStoreCoordinator?.persistentStores.last else {
return
}
guard let url = persistentStoreCoordinator?.URLForPersistentStore(persistentStore) else {
return
}
performBlockAndWait { () -> Void in
self.reset()
do
{
try self.persistentStoreCoordinator?.removePersistentStore(persistentStore)
try NSFileManager.defaultManager().removeItemAtURL(url)
try self.persistentStoreCoordinator?.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: url, options: nil)
}
catch { /*处理错误*/ }
}
}
}
以上是问题的原因和解决方法。
问题的原因是需要从Core Data的持久化存储中删除所有对象。解决方法是使用Swift编写的代码来执行此操作。
解决方法的代码如下:
if let psc = self.managedObjectContext?.persistentStoreCoordinator{
if let store = psc.persistentStores.last as? NSPersistentStore{
let storeUrl = psc.URLForPersistentStore(store)
self.managedObjectContext?.performBlockAndWait(){
self.managedObjectContext?.reset()
var error:NSError?
if psc.removePersistentStore(store, error: &error){
NSFileManager.defaultManager().removeItemAtURL(storeUrl, error: &error)
psc.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: storeUrl, options: nil, error: &error)
}
}
}
}
以上是问题的解决方法,使用Swift语言编写的代码可以删除Core Data持久化存储中的所有对象。
如何从Core Data中删除所有对象?
问题原因:用户想要清空Core Data中的所有对象。
解决方法:以下是一个可以完全清空Core Data的方法。这个方法适用于只有一个持久存储的情况,如果没有手动添加其他存储的话。如果managedObjectContext的名称与这里的相同,可以直接复制粘贴使用。
NSError * error; // 检索存储URL NSURL * storeURL = [[managedObjectContext persistentStoreCoordinator] URLForPersistentStore:[[[managedObjectContext persistentStoreCoordinator] persistentStores] lastObject]]; // 锁定当前上下文 [managedObjectContext lock]; [managedObjectContext reset];//放弃未决更改 // 从当前managedObjectContext中删除存储 if ([[managedObjectContext persistentStoreCoordinator] removePersistentStore:[[[managedObjectContext persistentStoreCoordinator] persistentStores] lastObject] error:&error]) { // 删除包含数据的文件 [[NSFileManager defaultManager] removeItemAtURL:storeURL error:&error]; // 像appDelegate方法一样重新创建存储 [[managedObjectContext persistentStoreCoordinator] addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error];//重新创建持久存储 } [managedObjectContext unlock]; // 完成!
感谢,非常好!一个问题:如何在ARC下使用'NSError ** error'?它会报错:'Pointer to non-const type "NSError **" with no explicit ownership'。
是的,你必须像这样声明它 _SomethingIDontRemeber NSError ** error,或者如果你不想要错误,可以直接传递nil,这样更容易一些... 😉
或者只需将第一行更改为'NSError *error',然后在之后的引用中使用'&error'。
你的代码对我来说不起作用,看看这个吧stackoverflow.com/questions/14646595/…
谢谢,这正是我需要的。在这个答案中,他们还提到,截至iOS 5,如果存在外部二进制存储,我们仍然需要删除它。stackoverflow.com/a/1222145/1672161
嗨,请你看一下我的问题stackoverflow.com/questions/19358095
完美无缺地运行!:)
请注意,lock方法已被弃用。解决方案应该使用performBlockAndWait方法: