💡 Migration
컬럼 명을 변경하였기 때문에 일치하지 않는다는 런타임 오류가 발생한다.
✅ 스키마 버전 체크
func checkSchemaVersion() {
do {
let version = try schemaVersionAtURL(realm.configuration.fileURL!)
print("schema version: \(version)")
} catch {
print(error)
}
}
db 테이블 스키마에 대한 버전을 관리하기 위해 migration 작업을 해야한다.
realm의 default schema 버전은 0
migration 작업은 appDelegate에서 작업해야 한다.
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
let config = Realm.Configuration(schemaVersion: 1)
Realm.Configuration.defaultConfiguration = config
return true
}
migration은 출시 이후에 대응하는 것이 중요해짐
oldSchemaVersion -> 현재 사용자의 버전
마이그레이션은 한 번에 여러 단계를 뛰어넘는 것이 아니라 순차적으로 해야 한다.
컬럼과 테이블 단순 추가 삭제의 경우엔 별도 코드가 필요 없음
migration 버전은 각각 if문으로 작성해야 한다.
사용자의 버전과 최신 버전의 차이가 여러 단계 차이가 난다면 차례로 모든 버전에 대한 처리를 진행해야 하기 때문에
migration이 되면서 샌드박스 시스템으로 인해 realm 파일의 위치가 계속해서 바뀐다.
✅ 기존 컬럼 명을 수정하고 싶다
renameProperty(onType: , from: , to: )
❗️ 컬럼 명을 변경하면서 해당 컬럼에 저장되어 있던 기존 데이터를 유지하여 수정해야 한다.
🚨 ranameProperty를 사용하지 않는다면?
컬럼 명 수정 시 renameProperty를 사용하지 않는다면 단순한 생성 또는 삭제로 인식하여 컬럼 내부 데이터를 옮기지 않은 체로 컬럼 명을 변경한다.
renameProperty를 사용하여 수정하지 않으면 해당 컬럼에 있던 값들이 전부 날라가버린다.
전부 초기화되어 DB내 데이터가 날라가기 때문에 migration작업은 아주 조심히 진행해야 한다.
복구불가‼️
✅ 컬럼 추가인데, 기존에 있는 데이터를 합쳐서 컬럼을 추가한다면?
✔️ migration.enumerateObjects()
개발 시 테이블구조가 가주 바뀌는데 매번 마이그레이션 하거나 앱을 지웠다 재설치 하는 것을 꽤나 번거로운 일..
Realm에서 테이블을 자동으로 지웠다가 다시 생성하는 메서드를 제공한다.
deleteRealmIfMigrationNeeded
디버깅 시에만 사용하도록 하자!
출시할 때는 사용하면 절대 안된다.
'iOS > 🔎 swift 정리하기' 카테고리의 다른 글
[iOS/Swift] MapKit - 원하는 곳에 어노테이션을 찍어보자 (0) | 2023.10.01 |
---|---|
[iOS/Swift] Realm - 백업 및 복구 구현하기 (0) | 2023.09.16 |
[iOS/Swift] Realm - 이미지 파일 저장하기 (0) | 2023.09.16 |
[iOS/Swift] Realm - CRUD (0) | 2023.09.16 |
[iOS/Swift] - Swift에서 값을 전달하는 방법 (0) | 2023.09.03 |