我的核心数据在我的应用中运行。因此,我获取XML文件,将数据解析为模型对象并将其插入到核心数据中。它们保存在持久性存储中,我可以在重新启动应用程序时访问它们。但是,我希望能够随意刷新持久存储中的数据,因此我需要先从存储中删除现有对象。对此有直接的方法吗?
由于
我找到了这个解决方案:
[managedObjectContext lock];
[managedObjectContext reset];//to drop pending changes
if ([persistentStoreCoordinator removePersistentStore:persistentStore error:&error])
{
NSURL* storeURL = [NSURL fileURLWithPath:[self pathForPersistentStore]];
[[NSFileManager defaultManager] removeFileAtPath:[storeURL path] handler:nil];
[self addPersistentStore];//recreates the persistent store
}
[managedObjectContext unlock];
答案 0 :(得分:62)
以下是我完全清理核心数据所做的工作。它完美地运作。如果您只有一个持久性存储,如果您没有手动添加一个,则可能就是这种情况。如果您的managedObjectContext具有与此处相同的名称,则只需复制/过去即可。
NSError * error;
// retrieve the store URL
NSURL * storeURL = [[managedObjectContext persistentStoreCoordinator] URLForPersistentStore:[[[managedObjectContext persistentStoreCoordinator] persistentStores] lastObject]];
// lock the current context
[managedObjectContext lock];
[managedObjectContext reset];//to drop pending changes
//delete the store from the current managedObjectContext
if ([[managedObjectContext persistentStoreCoordinator] removePersistentStore:[[[managedObjectContext persistentStoreCoordinator] persistentStores] lastObject] error:&error])
{
// remove the file containing the data
[[NSFileManager defaultManager] removeItemAtURL:storeURL error:&error];
//recreate the store like in the appDelegate method
[[managedObjectContext persistentStoreCoordinator] addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error];//recreates the persistent store
}
[managedObjectContext unlock];
//that's it !
答案 1 :(得分:7)
@Nicolas Manzini的快速版回答:
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)
}
}
}
}
答案 2 :(得分:6)
根据@Nicolas Manzini的回答,我写了一个Swift 2.1版本,几乎没有什么改进。我添加了NSManagedObjectContext
的扩展程序。完整代码如下:
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 { /*dealing with errors up to the usage*/ }
}
}
}
答案 3 :(得分:1)
您可以遍历所有对象并通过执行以下操作删除它们:
[managedObjectContext deleteObject:someObject];
如果要删除所有对象,可能最快删除商店,然后重新创建CoreData堆栈。
答案 4 :(得分:1)
将您的数据文件存档并重新制作。
答案 5 :(得分:1)
答案 6 :(得分:1)
import Foundation
import CoreData
extension NSManagedObjectContext
{
func deleteAllData() {
guard let persistentStore = persistentStoreCoordinator?.persistentStores.last else {
return
}
guard let url = persistentStoreCoordinator?.url(for: persistentStore) else {
return
}
performAndWait { () -> Void in
self.reset()
do
{
try self.persistentStoreCoordinator?.remove(persistentStore)
try FileManager.default.removeItem(at: url)
try self.persistentStoreCoordinator?.addPersistentStore(ofType: NSSQLiteStoreType, configurationName: nil, at: url, options: nil)
}
catch { /*dealing with errors up to the usage*/ }
}
}
}
感谢@Julian Krol-更新了Swift 5.1的答案
答案 7 :(得分:-4)
抛弃所有内容的最快方法是向您的托管对象上下文发送reset
消息。