요새 CoreData 관련 공부에 몰두 하고 있습니다.
이런저런것들을 보고 있는데, CoreData Version Up과 LightWeight Migration에 관련 챕터를보았는데,
Modeling 을 변경했을때 자동으로 Data Migration을 해준다는것입니다 !
그래서 한번 해보기로 했습니다.
아래는 WWDC 2010 의 "Mastering CoreData" Session의 Slide 캡처 화면입니다.
음 샬라샬라~
기존의 모델을 유지하고, Version 올려 주고, Option만 주면 된다는 간략한 내용이군요
기존의 자료 ( Apple의 Core Data Programming Guide 마저도... ) Xcode3기준으로 작성되어 약간의 Editor 사용법이 다르지만, 어렵지는 않습니다.
진행 순서는 아래와 같습니다.
1. 버전 추가
2. Attribute renaming
3. 소스 변경
4. Model Current Version 변경
5. 옵션 추가
1. 버전 추가
위와 같이 Model Editor에서 Editor->Add Model Version 클릭 해주시면 Version 생성 다이얼로그가 나오고는데 적당한 이름을 사용하시면 됩니다.
2. Attribute renaming
attribute의 이름을 변경합니다. 저는 createdDate라는 Attribute를 createdDate2로 변경했습니다.
예제를 rename 으로 한데는 이유가 있겠죠,
rename의 경우 original attribute name을 core data 쪽에 알려줘야합니다.
entity를 선택한후 Data Model Inspector의 "Renaming ID"에 원래 이름을 적어줍니다 저 같은 경우 createdDate가 되겠군요
3. Class 변경
class 의 변수 이름을 createdDate 에서 createdDate2로 변경해줍니다.
Xcode내의 refactoring 기능을 이용하면 한번에 수정가능합니다.
단, NSSortDescriptor나 NSPredicate에서 문자열로 사용한 경우에는 수동으로 찾아서 변경해주어야합니다.
위에서 보시는 바와 같이, Version을 추가하여, 새로 만들었지만, 현재는 예전의 Model을 사용하도록 되어 있습니다.
Model 파일의 Root(Locations.xcdatamodelId)를 선택한후 File Inspector를 열어서 현재 버전을 세팅 하실수 있습니다.
변경후의 모습은 다음과 같겠군요
5. NSPersistentStoreCoordinator Open Option설정하기
기본적으로는 Migration기능이 비활성화 되어 있기 때문에, lightweight migration기능을 사용하기 위해선, 몇가지 옵션을 설정해주어야 합니다.
NSInferMappingModelAutomaticallyOption 과 NSMigratePersistentStoresAutomaticallyOption 입니다.
코드는 아래와 같겠군요
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES],NSMigratePersistentStoresAutomaticallyOption,
[NSNumber numberWithBool:YES],NSInferMappingModelAutomaticallyOption,
nil];
NSError *error = nil;
__persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
if (![__persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error])
{}
이렇게 하고 실행하시면, 수정된 Model Class로 이전의 Data까지 사용가능하게 됩니다.
별로 어려운건 아닙니다만, 이래저래 개념적으로 확인해야 할것들이 많군요
CoreData는 살펴볼수록 괜찮은 녀석인것 같습니다 ^^