Using Lightweight Migration

Groot·2022년 10월 10일
1

TIL

목록 보기
62/153
post-thumbnail
post-custom-banner

TIL

🌱 난 오늘 무엇을 공부했을까?

📌 Using Lightweight Migration - 공식문서

  • 앱의 변경 사항과 일치하도록 데이터 모델을 업데이트하려면 경량(자동) 마이그레이션을 요청하십시오.

📍 Overview

  • Core Data는 일반적으로 경량 마이그레이션이라고 하는 자동 데이터 마이그레이션을 수행할 수 있습니다.
  • 경량 마이그레이션은 원본 및 대상 관리 개체 모델 간의 차이점에서 마이그레이션을 추론합니다.

🔗 Generating an Inferred Mapping Model

  • 자동 경량 마이그레이션을 수행하려면 Core Data가 런타임에 소스 및 대상 관리 개체 모델을 찾을 수 있어야 합니다.
  • Bundle 클래스의 allBundles 및 allFrameworks 메서드에서 반환된 번들에서 모델을 찾습니다.
  • 그런 다음 Core Data는 영구 엔터티 및 속성에 대한 스키마 변경 사항을 분석하고 추론된 매핑 모델을 생성합니다.
  • 유추된 매핑 모델을 생성하려면 다음과 같이 명백한 마이그레이션 패턴에 맞게 변경해야 합니다.
    • 속성 추가
    • 속성 제거
    • 선택적이 되는 비선택적 속성
    • 선택적 속성이 선택 사항이 아니며 기본값을 정의합니다.
    • 엔터티 또는 속성 이름 바꾸기

🔗 Managing Changes to Entities and Properties

  • 엔터티 또는 속성의 이름을 바꾸는 경우 대상 모델의 이름 바꾸기 식별자를 소스 모델의 해당 속성 또는 엔터티의 이름으로 설정할 수 있습니다.
  • Xcode 데이터 모델링 도구의 속성 관리자(엔티티 또는 속성에 대해)를 사용하여 관리되는 개체 모델에서 이름 바꾸기 식별자를 설정합니다.
  • 예를 들어 다음을 수행할 수 있습니다.
    • 자동차 엔터티의 이름을 Automobile로 변경
    • 자동차의 색상 속성 이름을 paintColor로 바꿉니다.
  • 이름 바꾸기 식별자는 정식 이름을 생성하므로 이름 바꾸기 식별자를 소스 모델의 속성 이름으로 설정합니다(해당 속성에 이름 바꾸기 식별자가 이미 있는 경우 제외).
  • 즉, 모델 버전 2에서 속성의 이름을 바꾼 다음 버전 3에서 다시 이름을 바꿀 수 있습니다.
  • 이름 바꾸기는 버전 2에서 버전 3으로 또는 버전 1에서 버전 3으로 올바르게 작동합니다.

🔗 Managing Changes to Relationships

  • 경량 마이그레이션은 관계 및 관계 유형의 변경 사항도 관리할 수 있습니다.
  • 새 관계를 추가하거나 기존 관계를 삭제할 수 있습니다. 속성과 마찬가지로 이름 바꾸기 식별자를 사용하여 관계의 이름을 바꿀 수도 있습니다.
  • 또한 관계를 일대일에서 대다수로 또는 비순서 대다수로 관계를 변경할 수 있습니다(또는 그 반대로도 가능).

🔗 Managing Changes to Hierarchies

  • 계층에서 엔터티를 추가, 제거 및 이름을 바꿀 수 있습니다.
  • 새 부모 또는 자식 엔터티를 만들고 엔터티 계층 구조의 위아래로 속성을 이동할 수도 있습니다.
  • 계층에서 엔터티를 이동할 수 있습니다.
  • 그러나 엔터티 계층을 병합할 수는 없습니다. 두 개의 기존 엔터티가 소스에서 공통 상위를 공유하지 않으면 대상에서 공통 상위를 공유할 수 없습니다.

🔗 Confirming Whether Core Data Can Infer the Model

  • Core Data가 실제로 마이그레이션 작업을 수행하지 않고 소스 모델과 대상 모델 간의 매핑 모델을 유추할 수 있는지 여부를 미리 확인하려는 경우, NSMappingModel의 inferredMappingModel(forSourceModel:destinationModel:) 메서드를 사용할 수 있습니다.
  • 이 메서드는 Core Data에서 생성할 수 있는 경우 추론된 모델을 반환합니다. 그렇지 않으면 nil을 반환합니다.
  • 데이터 변경이 자동 마이그레이션의 기능을 초과하는 경우 대규모 마이그레이션(종종 수동 마이그레이션이라고 함)을 수행할 수 있습니다.

🔗 Requesting Lightweight Migration

  • addPersistentStore(ofType:configurationName:at:options:)에 전달한 옵션 사전을 사용하여 자동 경량 마이그레이션을 요청합니다.
  • NSMigratePersistentStoresAutomaticallyOption 및 NSInferMappingModelAutomaticallyOption 키 모두에 해당하는 값을 true로 설정합니다.
    let psc = NSPersistentStoreCoordinator(managedObjectModel: mom)
    let options = [NSMigratePersistentStoresAutomaticallyOption: true, NSInferMappingModelAutomaticallyOption: true]
    do {
        try psc.addPersistentStore(ofType: NSSQLiteStoreType, configurationName: nil, at: storeURL, options: options)
    } catch {
        fatalError("Failed to add persistent store: \(error)")
    }
  • 이러한 설정을 사용하면 Core Data는 영구 저장소가 더 이상 현재 모델과 일치하지 않음을 감지할 때 경량 마이그레이션을 시도합니다.

📌 설정방법

  1. Entity 클릭 후 -> Editor -> Add Model Version.. 클릭
  1. 새로운 모델 만들기

  1. 현재 사용하는 모델을 변경해주기
  1. 모델 변경 후 Attribute 추가
  1. NSPersistentStoreDescription 설정

참고

profile
I Am Groot
post-custom-banner

0개의 댓글