2009-08-03 7 views
6

데이터 모델의 모든 엔터티/특성/관계를 매핑 한 후에 모든 관리 대상 개체를 만들었습니다. 이제는 엔티티/클래스 중 하나를 처음 디자인 할 때 고려하지 않은 추가 속성/관계를 추가해야하는 문제가 있습니다. 코어 데이터가 내 모든 모델을 지우고 새 xcdatamodel을 기반으로 다시 작성하지 않는 기존 NSManagedObject 클래스를 수정하는 방법이 있습니까?핵심 데이터의 엔터티에 특성 추가

xcdatamodel의 특성을 추가해도 기본 저장소 메커니즘이 업데이트됩니까? SQLite3을 영구 저장소로 사용한다고 가정하면 그에 따라 열을 추가 할 예정입니까?

답변

8

"내 xcdatamodel을 변경하고 생성 된 코드의 변경 사항을 NSManagedObject 파생 클래스의 기존 코드로 병합 할 수 있습니까?"라는 경우 간단합니다. 변경된 모델에 대한 코드를 생성 한 다음 변경 사항을 직접 파생 클래스에 병합합니다. 변경 사항은 단지 추가 속성 및 관계처럼 들리므로 사소한 것이어야합니다. 실제로 변경 사항이 사실상 자연스럽게 추가되는 경우 diff 및 패치를 사용하여 반자동으로 수행 할 수 있습니다.

그러나 기존 저장소를 새 스키마로 마이그레이션해야한다는 것을 의미하는 경우 앞에 작업해야합니다. 특정 조건 (직각 엔티티 추가, 가져온 속성 추가 등)이 필요하지는 않습니다. 기존 영구 저장소를 관리 대상 개체 컨텍스트의 영구 저장소 코디네이터에 추가하려고 할 때 또는하지 않을 때를 알 수 있습니다.

스키마 변경을 시작하기 전에 코어 데이터에서 migrations and versioning을 수행하는 방법을 항상 읽어야합니다. 기존 스토어를 유지해야하는 경우 항상 읽어야합니다. 이것은 핵심 데이터 저장소에 저장된 사용자 데이터가있는 앱에서 거의 확실합니다. 자동화 된 가져 오기 도구 또는 데이터 저장소 생성 유틸리티가 없으면 기존의 정적 저장소에도 마이그레이션이 필요할 수 있습니다.

0

세대 격차 디자인 패턴도 확인해야합니다. 이 상황에서 당신을 도울 것입니다. Here은 CoreData에서 세대 차이를 사용하는 것에 대한 SO 질문입니다.

9

데이터 모델을 복잡하게 변경하려면 모델의 버전을 만들고 이전 모델의 데이터를 새로운 모델로 마이그레이션해야합니다. 링크 된 문제에 대한 Apple의 가이드를 따르십시오. . 핵심 데이터가 당신을 위해 처리하는 비하인드 SQL에 대해 걱정하지 마십시오.

그러나 간단한 데이터 모델 변경을 위해 Apple은 코어 데이터의 iPhone OS 3.0 구현에서 lightweight migration이라는 새로운 기능을 도입했습니다. 광역 마이그레이션의 경우 Core Data는 속성 또는 엔티티의 이름 변경, 속성 삭제, 기본값이있는 속성 추가 또는 엔티티 상속 변경과 같이 데이터 모델의 간단한 변경을 통해 자동으로 마이그레이션합니다. NSMigratePersistentStoresAutomaticallyOption 및 NSInferMappingModelAutomaticallyOption 옵션을 on으로 설정하는 한 Core Data는 효율적인 방식으로 데이터 업데이트를 처리합니다. 예를 들어, 이전 버전의 이름을 가리키는 새 버전의 이름 바꾸기 식별자를 입력해야합니다. 영구 저장소.

+2

[Core Data Migration and Versioning] (http://www.timisted.net/blog/archive/core-data-migration/)에서 Apple 설명서에 남아있는 공란을 명확하게 채 웁니다. Xcode에서 '디자인> 데이터 모델> 모델 버전 추가'가 제가 누락 된 단계였습니다. –

+0

참고 : 기존 개체의 새 특성에 설정된 기본값을 얻으려면 "선택적"플래그를 선택 취소해야합니다. – Klaas

+0

@ShaunInman 링크를 사용할 수 없습니다. –

관련 문제