2012-11-13 2 views
1

CoreData 모델 버전에서 다양한 스키마 변경이 있습니다. 로컬 스키마는 단순히 네트워크 데이터의 캐시이기 때문에 sqlite 파일을 삭제하고 iOS 앱의이 버전에 대한 redownload를 강제로 수행하게되어 매우 기쁩니다.특정 (비 최신) MOM 버전으로 CoreData 저장소 열기

그러나

...

는 사용자가 작성이며 손실되지해야 DB에서 하나의 엔티티가있다.

새로운 버전의 앱에서는이 휘발성 데이터가 더 이상 CoreData 저장소에 기록되지 않지만 파일 시스템에 기록됩니다.

앱의 버전 2.0.1이 v1 스키마를 사용하고 데이터를 복사하지만 깨진 스키마가 변경되지 않았으며 버전 2.0.2가 적용되도록 단계별로 진행하고 있습니다. 응용 프로그램은 스키마 변경 사항을 추가하고 DB를 삭제할 수 있습니다. 데이터가 제거되었지만 앱 스토어가 작동하는 방식으로 인해 사용자가 .0-.1-.2로 변경되는 것을 보장 할 수 없습니다. 그들은 .0에서 .2로 직선적으로 갈 수 있으며 코어 데이터 저장소를 열려고 할 때 급격한 변화를 겪을 수 있습니다.

모든 의견, 조언, 의견을 환영합니다.

업데이트 : 마이 그 레이션을 '속이는'방법이 궁금합니다. 휘발성 데이터를 제외한 모든 것을 무시하고 실제로 마이그레이션하지 않는 사용자 지정 마이그레이션 정책은 파일 시스템에 기록합니다. 일단 실행되면 파일 시스템에 휘발성 데이터가 있고 새 스키마를 기반으로하는 빈 데이터베이스가 있습니다.

답변

0

마이 그 레이션을 위조하는 것이 더 나을 것이라고 생각합니다. 여기에 원하는 엄마를 데려 오기위한 코드가 있습니다. EntryModel을 모델 이름으로 바꾸고 버전을 조정하십시오. 그런 다음 NSPersistentStoreCoordinator에서 "- (id) initWithManagedObjectModel"메서드를 사용하여 원하는 모델에 저장소 코디네이터를 가져옵니다.

- (NSManagedObjectModel *)managedObjectModelForVersion:(NSString*)version { 

NSString *modelPath = [[NSBundle mainBundle] pathForResource:@"EntryModel" ofType:@"momd"]; 
if (BETWEEN_INEX(version, @"1.0", @"1.4")) { 
    modelPath = [modelPath stringByAppendingPathComponent:@"EntryModel"]; 
    modelPath = [modelPath stringByAppendingPathExtension:@"mom"]; 
} else if (BETWEEN_INEX(version, @"1.4", @"1.5")) { 
    modelPath = [modelPath stringByAppendingPathComponent:@"EntryModel 2"]; 
    modelPath = [modelPath stringByAppendingPathExtension:@"mom"]; 
} else if (BETWEEN_INEX(version, @"1.5", @"1.6")) { 
    modelPath = [modelPath stringByAppendingPathComponent:@"EntryModel 3"]; 
    modelPath = [modelPath stringByAppendingPathExtension:@"mom"]; 
} else if (BETWEEN_INEX(version, @"1.6", @"1.7")) { 
    modelPath = [modelPath stringByAppendingPathComponent:@"EntryModel 4"]; 
    modelPath = [modelPath stringByAppendingPathExtension:@"mom"]; 
} 
NSURL *modelURL = [NSURL fileURLWithPath:modelPath]; 
NSManagedObjectModel * oldManagedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL]; 
NSSet *vIdentifiers = [oldManagedObjectModel versionIdentifiers]; 
for (NSString * identifier in vIdentifiers) { 
    NSLog(@"Old Model : %@",identifier); 
} 
return [oldManagedObjectModel autorelease]; 
} 

이 유용 할 수 있습니다 :

#define GREATER_THAN(w,v)    ([w compare:v options:NSNumericSearch] == NSOrderedDescending) 
#define GREATER_THAN_OR_EQUAL_TO(w,v) ([w compare:v options:NSNumericSearch] != NSOrderedAscending) 
#define LESS_THAN(w,v)     ([w compare:v options:NSNumericSearch] == NSOrderedAscending) 
#define LESS_THAN_OR_EQUAL_TO(w,v)  ([w compare:v options:NSNumericSearch] != NSOrderedDescending) 
#define BETWEEN_INCLUDE(w,v,z)  (GREATER_THAN_OR_EQUAL_TO(w,v) && LESS_THAN_OR_EQUAL_TO(w,z)) 
#define BETWEEN_EXCLUDE(w,v,z)  (GREATER_THAN(w,v) && LESS_THAN(w,z)) 
#define BETWEEN_INEX(w,v,z)  (GREATER_THAN_OR_EQUAL_TO(w,v) && LESS_THAN(w,z)) 
#define BETWEEN_EXIN(w,v,z)  (GREATER_THAN(w,v) && LESS_THAN_OR_EQUAL_TO(w,z)) 
+0

내가 지연에 대한 미안 해요. 웬일인지 나는 단지이 대답을 보았다. 행운을 빕니다, 이것은 본질적으로 제가 한 일입니다 :-) –

관련 문제