2011-07-07 9 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; 

そして、動作するようです私が保存しようとすると、問題がです新しいデータ、その後。私が好きな何かを行う場合:それは保存afterContextにクラッシュし

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"); 

を、それは私にEXC_BAD_INSTUCTION例外をgaves。私は [appDelegate managedObjectContext]を実行すると、新しいpersistentStoreが作成されるので、何が問題か分かりません。以前のオブジェクトへの参照ですか? stacktraceは何の手がかりも与えません。

答えて

2

私は[appDelegate managedObjectContext]やることは正しいですが、1つが存在しない場合にのみ 新しいpersistentStore

を作成します。自分が所有していないオブジェクトを "取る"ことはできません。それを解放してから、それをゼロに設定し、動作させることを期待してください。 storeCoordinatorをアプリケーションデリゲートコーディネーターに設定する行は、ポインタ値を設定するだけです。そのコーディネーターを最後に解放し、それをnilに設定すると、AppDelegateはまだ割り振り解除されたコーディネーターのアドレスに設定されます。それがあなたのクラッシュの理由です。実際のAppDelegate自体の値を解放したり除外する方法を考え出す必要があります。また、appDelegateの管理対象オブジェクトのコンテキストは、変更を反映するために更新する必要があります。

+0

チップありがとう!デリゲートですべてを行うことと、コンテキストnil(後で再作成)を設定することですべてが解決されました。 PS:あなたの答えは、私がポインタについて考えるようにしたのです。なぜ、私はデリゲートでそれをする必要があったのですか。本当にありがとう! – ferostar

関連する問題