본문 바로가기
프로그래밍/iOS

[Core Data] Core Data Version Up 후 LightWeight Migration 하기

by 백룡화검 2013. 7. 21.

출처 : http://warmz.tistory.com/802


참고::

http://taehoonkoo.tistory.com/172

예제소스::



Data Model (Managed Object Model)에 정의된 Entity를 수정하고 싶은 경우가 있다. Entity를 더 추가할 일이 있을 수도 있고, 기존 Entity에 attribute를 추가하거나, rename 혹은 delete하는 경우 Core Data framework에서 지원하는 Version Up & LightWeight Migration 기능을 활용하면 안전하게 데이터를 유지하면서 수정이 가능하다.


조건은 위와 같다. 반드시 기존 Data Model (.xcdatamodeld) 파일은 유지하고 있어야 한다는 것.

마이그레이션 순서는 아래와 같다.

 1. Data Model Version 추가.
 2. Entity 수정 (혹은 추가).
 3. Entity에 관련된 소스 수정.
 4. 추가된 Data Model로 Model Current Version 변경.
 5. Migration 활성화 Option 코드 추가.

1. Data Model Version 추가

Data Model을 선택한 후 상단 메뉴에서 Editor > Add Model Version... 을 선택한다. 그리고 Data Model을 추가한다.

위 그림과 같이 새로운 Data Model이 추가된다.




2. Entity를 수정

추가된 Data Model을 선택한 후 Contact 엔티티에서 group 어트리뷰트를 추가하고 phone 어트리뷰트명을 tel로 수정하였다.


어트리뷰트명을 수정하는 경우에는 Core Data에 기존 attribute의 이름이 변경되었다는 것을 알려줘야한다. 수정한 Entity를 선택한 후 Data Model Inspector의 "Renaming ID"에 기존 어트리뷰트명을 적어준다.




3. Entity와 관련된 소스 수정

예제 소스는 Entity가 Class로 구체화되어 있으므로 Contact Entity와 관련된 소스는 추가되거나 변경된 점과 일치하도록 수정해야한다.

1
2
3
4
5
6
7
8
9
10
// 기존 Entity
@property (nonatomic, retain) NSString * address;
@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) NSNumber * tel;
 
// 수정된 Entity
@property (nonatomic, retain) NSString * address;
@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) NSNumber * tel;
@property (nonatomic, retain) id group;
1
2
3
4
5
6
7
8
9
10
// 기존 Entity
@dynamic address;
@dynamic name;
@dynamic tel;
 
// 수정된 Entity
@dynamic address;
@dynamic name;
@dynamic tel;
@dynamic group;




4. Model Current Version 변경

위 그림과 같이 Data Model은 추가되었지만 아직까지는 예전 Data Model을 사용하도록 설정되어 있다. 이것을 새로 추가한 Data Model로 변경해야 한다.

Model 파일의 Root 파일(MyCoreData.xcdatamodeld)을 선택한 후 File Inspector를 열어서 버전을 수정한다.

Current Version을 추가된 Data Model로 변경한다.




5. Migration 활성화 Option 코드 추가

기본적으로 마이그레이션이 비활성화 되어 있기 때문에 아래 옵션을 작성하여 addPersistentStoreWithType:configuration:URL:options:error: 에 파라메터로 추가한다.
1
2
3
4
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
           [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
           [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption,
           nil];


이렇게 수정이 완료되면 기존의 데이터를 유지하면서 업데이트된 엔티티를 사용할 수 있게 된다.

수정된 DB)