apple/iOS

[Realm] Realm migration (Swift)

lgvv 2022. 9. 5. 20:01

Realm migration (Swift)

 

해당 포스팅은 2번에 걸쳐 업데이트 될 예정입니다.

1. isBookmarked 필드를 추가하는 v2 마이그레이션 (✅ 2022.09.05 21:49 작성완료)

2. v2데이터를 사용하다가 또 다시 v3로 마이그레이션 (🟡 Not yet)

 

 

 

다들 알다시피 Realm의 경우에는 앱 설치 후 모델을 변경하면 migration이 필요함.

이 작업을 예전에 UserDefault로 Kuring 프로젝트에서 다른 개발자님이 하

셨었는데, 

나도 도전 🔥

(좌기존 모델 (우) 새로운 모델

모델을 변경하고 앱을 딱 실행하면?

Thread 1: Fatal error: 'try!' expression unexpectedly raised an error: Error Domain=io.realm Code=10 "Migration is required due to the following errors: - Property 'Note.isbookmarked' has been added." UserInfo={NSLocalizedDescription=Migration is required due to the following errors: - Property 'Note.isbookmarked' has been added., Error Code=10}

 

마이그레이션 하라는 문구가 나타남

 

일단 기존 모델로 저장된 값들을 Realm-Studio(Realm browser도 된다는데, 나 잘 안되어서 일단 이거 씀) 확인해보면

 

기존 값들!!

 

위 사진처럼 4개의 기존필드들이 들어가 있음.

 

일단 나는 해당 모델에서 마이그레이션도 처리하는게 제일 적절하다고 봄.

이건 Kuring의 다른 개발자님도 이렇게 설계! (직접 해보니까 3000정도 더 우러러보게 된다.)

 

설계하자!!

 

🌿 그래서 마이그레이션 🌿

 

해당 모델에 이 부분을 추가한다.

    // MARK: - migration
    static func migration(minimumVersion: UInt64) {
        // 🍬 1. config 설정 (이전 버전에서 다음 버전으로 마이그레이션 될 때)
        let cofiguration = Realm.Configuration(
            // 🍬 2. 새로운 버전 스키마 설정
            schemaVersion: minimumVersion
        ) { migration, oldSchemaVersion in
            // 🍬 3. 마이그레이션 수행
            
            // 🍬 3-1. 지난 버전이 최소 지원 버전보다 낮으면
            if oldSchemaVersion < minimumVersion {
                
                // 🍬 3-2. 마이그레이션을 통해 빈 필드 값 채워주기
                migration.enumerateObjects(
                    ofType: Note.className()
                ) { oldObject, newObject in
                    // 🍬 3-3. 새로운 필드를 채워 넣기
                    newObject?["isBookmarked"] = false
                }
            }
        }
        
        // 🍬 4. Realm이 새로운 Object를 사용할 수 있도록 설정
        Realm.Configuration.defaultConfiguration = cofiguration
    }

 

그리고 나서 Realm의 extension으로 이렇게 migration 관련한 코드를 작성해 줌!

🤔 why? 

✅ 모델이 여러개가 있을탠데, 여기서 한번에 저렇게 작성하면 관리하기가 편해져서!

 

그리고 마지막으로 AppDelegate에 해당 코드를 넣어서 마이그레이션!

AppDelegate에 추가

 

마이그레이션 성공!

마이그레이션 성공!!

 

 

NG?

어우 야,, 뭐가 이렇게 많이 나와

 

 

(참고)

https://www.mongodb.com/docs/realm/sdk/swift/model-data/change-an-object-model/#std-label-ios-perform-a-schema-migration

 

Change an Object Model - Swift SDK — Realm

Avoid nesting or otherwise skipping if (oldSchemaVersion < X) statements in migration blocks. This ensures that all updates can be applied in the correct order, no matter which schema version a client starts from. The goal is to define migration logic whic

www.mongodb.com

https://jerry-bakery.tistory.com/entry/iOS-iOS-Realm-Migration%EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98-%ED%95%98%EB%8A%94%EB%B2%95

 

[iOS] iOS Realm Migration(마이그레이션) 하는법

안녕하세요 Jerry입니다. Realm 데이터베이스를 Migration(마이그레이션) 하는 법에 대해 알아보겠습니다. iOS를 공부하면서 정리하는 것이기 때문에 미흡한 점이 있을 수 있습니다. 부족한 점에 대해

jerry-bakery.tistory.com