2011-07-07 15 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