2011-04-23 85 views
6

我需要删除我的持久存储(按对象执行对象不实际,因为我有超过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后再取出持久性商店,但我仍然得到同样的错误。

回答

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

哇,我认为问题是'removePersistentStore'。没有这条线它工作...我很好奇,但为什么。 – David 2011-04-24 16:56:02

+1

我有一种感觉,即在使用“允许外部存储”的核心数据属性时,删除.sqlite文件会留下大量垃圾。 – magma 2014-01-08 01:45:31

+0

岩浆是正确的,如果你使用iCloud被使用等问题就会发生。 – 2015-04-21 01:41:17

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

在尝试删除商店之前,您需要确保附加到持久性存储的任何托管对象上下文已经发布。否则,上下文将唤起该错误。

+0

我试过,无济于事(请参阅更新的代码)。 – David 2011-04-24 05:48:38

相关问题