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

내가 여러 응용 프로그램에서 "데이터를 재설정"기능을 수행하는 방법이다. 그게 바로 removePersistentStore을 사용하지 않고 당신이하려고하는 것입니다. 나중에 persistentStore 코디네이터를 다시 빌드 할 것이므로 걱정하지 않아도됩니다. 그런 다음 다음 코어 데이터 호출에서 체인은 싱글 톤 - 게으른 스타일의 생성자를 사용하여 투명하게 다시 작성됩니다.

- (NSManagedObjectModel *) managedObjectModel { 
    if (!_managedObjectModel) 
    _managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain]; 
    return _managedObjectModel; 
} 
+1

와우, 문제는 'removePersistentStore'라고 생각합니다. 그 라인이 없었다면 효과가있었습니다 ... 왜 그래야할지 궁금합니다. – David

+1

.sqlite 파일을 제거하면 "외부 저장소 허용"이라는 핵심 데이터 특성을 사용할 때 많은 쓰레기가 남을 것입니다. – magma

+0

마그마가 맞습니다. iCloud를 사용하면 문제가 발생합니다. –

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

저장소를 삭제하기 전에 영구 저장소에 연결된 관리되는 개체 컨텍스트가 해제되었는지 확인해야합니다. 그렇지 않으면 컨텍스트가 해당 오류를 발생시킵니다.

- (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... 
} 

는 기본적으로 난 그냥 다음 persistentStore 파일을 삭제 CoreData 체인을 해제 : 여기

+0

나는 아무 소용이 없다고 (업데이트 된 코드 참조) 시도했습니다. – David

관련 문제