2013-04-19 4 views
11

데이터 모델 응용 프로그램의 크래시에 속성을 수동으로 추가하고 데이터를 삽입하는 데 사용 된 컨텍스트 저장으로 인해 코어 데이터를 사용하는 프로젝트가 있습니다. 기존 엔티티에 더 많은 특성 (열)을 추가해야합니다 (열). 테이블에 이전기존 코어 데이터 엔티티에 속성을 추가하는 방법은 무엇입니까?

Plz은 다음이 customizing-core-data-migrations

또는이 참조하십시오 ... 몇 가지 단계를 수행해야하는 기존 코드 데이터 모델의 속성을 변경하려면 .. 당신에게

답변

21

감사 도움 많은 도움이 될 것입니다. how-to-perform-a-lightweight-core-data-migration

+0

감사합니다. –

+12

URL로 응답하지 말거나 질문에 대답하는 하이라이트를 붙여 넣으십시오. 외부 링크가 항상있을 것이라고 보장 할 수는 없습니다 ... – dooleyo

+1

사실, 첫 번째 링크는 죽은 게이트웨이입니다. – rattletrap99

4

엔티티에 속성 만 추가하는 경우 코어 데이터에 자동화 된 lightweight migration을 사용할 수 있습니다.

기본적으로 영구 저장소를 추가 할 때 NSDictionary 인스턴스를 적절한 옵션으로 전달하면됩니다. 여기 _persistentStoreCoordinator에 대한 접근 방법의 끝에서 코드 조각입니다 : 마이그레이션 경량 마이그레이션 너무 복잡

NSNumber *optionYes = [NSNumber numberWithBool:YES]; 
NSDictionary *options = [NSDictionary dictionaryWithObjects:@[optionYes] forKeys:@[NSMigratePersistentStoresAutomaticallyOption]]; 
if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]) { 
    NSLog(@"Error opening persistent store: %@, %@", error, [error userInfo]); 
    abort(); 
} 
return _persistentStoreCoordinator; 

경우 오류를 볼 수 있습니다. 그렇지 않으면 이주가 실행되어야하며 새 스키마와 일치하도록 데이터베이스가 갱신됩니다.

기기에서 실제로 이것을 수행하는 경우 마이그레이션에서 문제가 발생하면 먼저 .sqlite 파일을 백업해야합니다.

2

그래서이 영구 저장소 코디네이터 코드가 어디에 쓰이는지 전혀 알지 못했습니다. 프로젝트를 만들 때 "핵심 데이터 사용"을 선택하면 자동으로 AppDelegate 구현에 생성됩니다.

  1. 는 메뉴에서 .xcdatamodeld
  2. 을 선택

    그래서, 두 번째 링크 here에서 모두 다음과 같은 경량 마이그레이션 (새 특성 및 추가)을 위해하는 것입니다 필요 , 편집기 선택 -> 모델 추가 버전

  3. 새 버전의 이름을 "모델 기준"
  4. 에서 선택하십시오. .xcdatamodeld의 파일 관리자에서 모델 버전 -> 현재 -> 새 모델을 선택하십시오. 버전
  5. Project Navigator의 .xcdatamodd에서 새 모델 버전을 선택하고 모델을 변경하십시오.
  6. 속성 이름이나 유형을 변경 한 경우 매핑 파일, 새 파일 -> 코어 데이터 -> 매핑 모델 -> 생성 다음과 같이

은 AppDelegate에 영구 저장소 코디네이터 코드를 변경 새로운 매핑 모델에서 소스 및 대상 모델 버전

  • 업데이트를 매핑을 선택합니다.

    lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator? = { 
        var coordinator: NSPersistentStoreCoordinator? = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel) 
        let url = self.applicationDocumentsDirectory.URLByAppendingPathComponent("<data model name>.sqlite") 
        var error: NSError? = nil 
        var failureReason = "There was an error creating or loading the application's saved data." 
        let options = [ 
        NSMigratePersistentStoresAutomaticallyOption: true, 
        NSInferMappingModelAutomaticallyOption: true] 
        if coordinator!.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: url, options: options, error: &error) == nil { 
         coordinator = nil 
         // Report any error we got. 
         var dict = [String: AnyObject]() 
         dict[NSLocalizedDescriptionKey] = "Failed to initialize the application's saved data" 
         dict[NSLocalizedFailureReasonErrorKey] = failureReason 
         dict[NSUnderlyingErrorKey] = error 
         error = NSError(domain: "YOUR_ERROR_DOMAIN", code: 9999, userInfo: dict) 
         // Replace this with code to handle the error appropriately. 
         // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. 
         NSLog("Unresolved error \(error), \(error!.userInfo)") 
         abort() 
        } 
    
        return coordinator 
    }() 
    

    따라서 addPersistentStoreWithType 호출에만 마이그레이션 옵션을 추가하십시오.

  • 관련 문제