2011-07-07 18 views
1

我需要刪除所有用戶信息並重新創建它。我用它來創造一切的代碼在應用程序的委託:重新創建CoreData時的上下文問題

- (NSManagedObjectContext *)managedObjectContext { 
    if (managedObjectContext != nil) { 
     return managedObjectContext; 
    } 
    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; 
    if (coordinator != nil) { 
     managedObjectContext = [[NSManagedObjectContext alloc] init]; 
     [managedObjectContext setPersistentStoreCoordinator:coordinator]; 
    } 
    return managedObjectContext; 
} 

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator { 
    if (persistentStoreCoordinator != nil) { 
     return persistentStoreCoordinator; 
    } 
    NSString* dir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, 
                NSUserDomainMask, YES) lastObject]; 
    NSURL *storeURL = [NSURL fileURLWithPath: [dir stringByAppendingPathComponent: 
              @"Data.sqlite"]]; 
    NSError *error = nil; 
    persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] 
           initWithManagedObjectModel:[self managedObjectModel]]; 
    if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType 
               configuration:nil URL:storeURL options:nil error:&error]) { 
     NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
     abort(); 
    } 
    return persistentStoreCoordinator; 
} 

然後,我刪除了一切:

[context reset]; 

NSString* dir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, 
                NSUserDomainMask, YES) lastObject]; 
NSURL *storeURL = [NSURL fileURLWithPath: [dir stringByAppendingPathComponent: 
              @"Data.sqlite"]]; 

NSError *error; 
NSURL *storeURL = store.URL; 
NSPersistentStoreCoordinator *storeCoordinator = [((CustomAppDelegate *)[[UIApplication sharedApplication] delegate]) persistentStoreCoordinator]; 

NSPersistentStore *store = [[storeCoordinator persistentStores] objectAtIndex:0]; 

[storeCoordinator removePersistentStore:store error:&error]; 
[[NSFileManager defaultManager] removeItemAtPath:storeURL.path error:&error]; 

[storeCoordinator release]; 
storeCoordinator = nil; 

而且似乎工作,問題是當我嘗試保存新數據,之後。如果我這樣做:

NSManagedObjectContext *afterContext = [appDelegate managedObjectContext]; 
NSEntityDescription *userEntity = [NSEntityDescription entityForName:@"User" 
               inManagedObjectContext:afterContext]; 
NSManagedObject *user = [NSEntityDescription 
         insertNewObjectForEntityForName:[userEntity name] inManagedObjectContext:afterContext]; 
[user setValue:@"John" forKey:@"firstName"]; 
if(![afterContext save:&error]) 
    NSLog(@"oops"); 

崩潰在afterContext保存,它gaves我EXC_BAD_INSTUCTION例外。當我做 [appDelegate managedObjectContext]它創建新的persistentStore,所以我不知道可能是什麼問題。對前一個對象的引用?堆棧跟蹤根本沒有提供任何線索。

回答

2

當我做[的appDelegate managedObjectContext]它創建 新persistentStore

這是正確的,但只有當一個已經不存在。你不能「接受」你不擁有的物體,釋放它,然後將它設置爲零,並期望它能夠工作。您將應用程序代理協調器的storeCoordinator設置爲只設置指針值。當你在最後釋放協調器並將其設置爲零時,AppDelegate仍然被設置爲現在釋放的協調器的地址。這是你崩潰的原因。你需要想出一個方法來釋放和刪除實際的AppDelegate本身的值。此外,appDelegate中的託管對象上下文將需要更新以反映更改。

+0

感謝您的提示!讓所有事情都在委託中進行並設置上下文無(之後重新創建)解決了所有問題。 PS:你的回答讓我想到了指針,爲什麼我需要在代表中這麼做,真的如此:謝謝! – ferostar