2011-04-23 91 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

相關問題