2012-06-26 4 views
0

이전에는 핵심 데이터를 사용하는 앱이 있습니다. 동일한 저장소 URL을 사용하여 NSManagedObjectModel을 초기화하고 NSPersistentStoreCoordinator를 만듭니다. 그러나, 새로운 애플 리케이션에서, 나는 같은 방식으로 사용하려고, 모델을 만들 수 없습니다. 그래서 NSManagedObjectModel을 만들려면 모델 URL (이 포럼에서 찾았습니다)을 사용해야합니다. 이슈가 뭐야? 여기핵심 데이터 모델 경로 vs 저장 경로

- (NSString *)storeName 
{ 
    return @"ABC.storedata"; 
} 

- (NSURL *)storeUrl 
{ 
    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:self.storeName]; 
    return storeURL; 
} 

- (NSManagedObjectModel *)managedObjectModel { 
    if (_managedObjectModel == nil) { 
     _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:[self storeUrl]]; 
    } 
    return _managedObjectModel; 
} 


- (NSPersistentStoreCoordinator *)persistentStoreCoordinator 
{ 
    if (_persistentStoreCoordinator != nil) { 
     return _persistentStoreCoordinator; 
    }  
    NSError *error = nil; 
    _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; 
    if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:[self storeUrl] options:nil error:&error]) { 

     abort(); 
    }  

    return _persistentStoreCoordinator; 
} 

NEW 응용 프로그램에서입니다 : 여기

는 OLD 응용 프로그램에서입니다 그들은 매우 다른 두 가지이기 때문에

- (NSString *)storeName 
{ 
    return @"DEF.sqlite"; 
} 

- (NSURL *)storeUrl 
{ 
    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:self.storeName]; 
    return storeURL; 
} 

- (NSURL *)modelUrl 
{ 
    NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"DEF" withExtension:@"momd"]; 
    return modelURL; 
} 

- (NSManagedObjectModel *)managedObjectModel { 
    if (_managedObjectModel == nil) { 
     _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:[self modelUrl]]; 
    } 
    return _managedObjectModel; 
} 


- (NSPersistentStoreCoordinator *)persistentStoreCoordinator 
{ 
    if (_persistentStoreCoordinator != nil) { 
     return _persistentStoreCoordinator; 
    }  
    NSError *error = nil; 
    _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; 
    if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:[self storeUrl] options:nil error:&error]) { 

     abort(); 
    }  

    return _persistentStoreCoordinator; 
} 

답변

1

당신은 모델과 영구 저장소 모두에 대해 동일한 URL을 사용하지 않을 수 있습니다 .

모델 URL은 .momd 파일 패키지 인 Xcode 프로젝트에 포함 된 실제 모델 리소스를 가리켜 야합니다. 영속 저장소가 귀하의 경우에는 데이터베이스, 문서 디렉토리에있는 .sqlite 파일입니다.

과거에 어떻게 작동했는지 상상할 수 없습니다. 한 가지 가능성은 ABC.storedata에 후행 .sqlite가 없기 때문에 핵심 데이터에 .sqlite가 추가되어 있어야하고 DEF.storedata가 모델 이름과 어떻게 든 일치 할 수 있었습니까?

NSURL *modelURL    = [[NSBundle mainBundle] URLForResource:@"Model" withExtension:@"momd"];   
model      = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL]; 

영구 저장소에 관해서는 아무런 제한이 없습니다 :

이것은 당신이 모델 리소스에 대한 Xcode 프로젝트에이 이름으로 "모델"을 대체 모델을 초기화하는 적절한 방법입니다. 대부분의 경우 응용 프로그램 문서 디렉토리에 있어야합니다.

+0

오케이. 당신 말이 맞아요. OLD 앱이 작동하는 이유가 있습니다. OLD 앱은 initWithContentsOfURL이 아닌 mergedModelFromBundles를 사용합니다. – angelokh