我需要删除我的持久存储(按对象执行对象不实用,因为我有超过100,000个对象)。我试过这个:
- (IBAction)resetDatabase:(id)sender {
NSPersistentStore* store = [[__persistentStoreCoordinator persistentStores] lastObject];
NSError *error = nil;
NSURL *storeURL = store.URL;
// release context and model
[__managedObjectContext release];
[__managedObjectModel release];
__managedObjectModel = nil;
__managedObjectContext = nil;
[__persistentStoreCoordinator removePersistentStore:store error:nil];
[__persistentStoreCoordinator release];
__persistentStoreCoordinator = nil;
[[NSFileManager defaultManager] removeItemAtPath:storeURL.path error:&error];
if (error) {
NSLog(@"filemanager error %@", error);
}
// recreate the stack
__managedObjectContext = [self managedObjectContext];
}
但是当我尝试在之后将实体插入商店时出现此错误:
This NSPersistentStoreCoordinator has no persistent stores. It cannot perform a save operation.
更新 我尝试在删除持久存储之前释放MOC和MOM,但我仍然遇到同样的错误。
答案 0 :(得分:9)
以下是我在多个应用中执行“重置数据”功能的方法:
- (void)reset {
// Release CoreData chain
[_managedObjectContext release];
_managedObjectContext = nil;
[_managedObjectModel release];
_managedObjectModel = nil;
[_persistentStoreCoordinator release];
_persistentStoreCoordinator = nil;
// Delete the sqlite file
NSError *error = nil;
if ([fileManager fileExistsAtPath:_storeURL.path])
[fileManager removeItemAtURL:_storeURL error:&error];
// handle error...
}
基本上我只是发布了CoreData链,然后删除了persistentStore文件。这就是你要做的,不使用removePersistentStore
,我不在乎,因为我稍后会重建persistentStore协调器。然后在下一个核心数据调用中,使用单独的惰性样式构造函数透明地重建链:
- (NSManagedObjectModel *) managedObjectModel {
if (!_managedObjectModel)
_managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];
return _managedObjectModel;
}
答案 1 :(得分:2)
您可以在外部执行此操作,因为您只需在开发应用程序时执行此操作。我打开了一个终端,在重新运行我的应用程序之前,我手动删除了商店。您需要知道的只是它所在的位置。每当我的应用程序使用以下代码运行时,我都会将其记录到控制台:
[[CoreDataSingleton sharedManager] managedObjectContext]; //be sure to create the store first!
//Find targeted mom file in the Resources directory
NSString *momPath = [[NSBundle mainBundle] pathForResource:@"Parking" ofType:@"mom"];
NSLog(@"momd path: %@",momPath);
希望有所帮助!
答案 2 :(得分:2)
在尝试删除存储之前,需要确保已释放附加到持久性存储的任何托管对象上下文。否则,上下文将引发该错误。