Realm 기초 - (Swift) Migration

Jiny·2023년 11월 15일
0

Realm 기초

목록 보기
3/3

Object에 키값 추가

Realm의 키값을 추가가하거나 타입을변경하는등 Object에 수정이 있을때는 꼭 마이그레이션 과정을 거쳐줘야하는데 저는 원래 이렇게 생긴 Object에 createdBy를 추가해줄거에요.

import Foundation
import RealmSwift

class SomeModelObject: Object {
    @Persisted(primaryKey: true) var id: String
    @Persisted var title: String
    @Persisted var desc: String
    @Persisted var isDone: Bool
    @Persisted var date: Date
    @Persisted var optionType: List<Int>
    @Persisted var rootId: String

    convenience init(title: String) {
        self.init()
        self.id = UUID().uuidString
        self.title = title
        self.desc = ""
        self.isDone = false
        self.date = Date()
        self.optionType = List<Int>()
        self.rootId = ""
    }
}
import Foundation
import RealmSwift

class SomeModelObject: Object {
    @Persisted(primaryKey: true) var id: String
    @Persisted var title: String
    @Persisted var desc: String
    @Persisted var isDone: Bool
    @Persisted var date: Date
    @Persisted var optionType: List<Int>
    @Persisted var rootId: String
    @Persisted var createdBy: Date // 값 추가 

    convenience init(title: String) {
        self.init()
        self.id = UUID().uuidString
        self.title = title
        self.desc = ""
        self.isDone = false
        self.date = Date()
        self.optionType = List<Int>()
        self.rootId = ""
        self.createdBy = Date()
    }
}

변경된 Object에 대한 마이그레이션

그리고 AppDelegate를 통해 앱이 켜질때마다 Realm 버전을 확인하고 마이그레이션 시켜주면되는데 AppDelegate의 사이즈가 커지는것을 원하지 않으니 따로 Realm Migration을 담당할 Class를 만들어 줬어요.

import RealmSwift
import Foundation

class RealmMigrationManager {

    // 싱글톤 인스턴스 생성
    static let shared = RealmMigrationManager()

    // 마이그레이션 메서드
    func performMigration() {
        let config = Realm.Configuration(
            // 현재 Realm 데이터베이스의 버전을 지정
            schemaVersion: 2,

            // 데이터베이스 업그레이드가 필요한 경우 호출되는 블록
            migrationBlock: { migration, oldSchemaVersion in
                if oldSchemaVersion < 2 {
                    self.migrationV2(migration)
                }
            })

        // 새 구성으로 Realm 데이터베이스 열기
        Realm.Configuration.defaultConfiguration = config
        do {
            // 마이그레이션 수행
            _ = try Realm()
        } catch {
            // 마이그레이션 실패 시 처리할 내용
            print("Realm migration failed with error: \(error.localizedDescription)")
        }
    }
    
    private func migrationV2(_ migration: Migration) {
        // 스키마 버전 1에서 2로 마이그레이션 수행
        // 변경된 속성이나 새로운 모델을 추가할 수 있습니다.
        // 기존 객체들에 대한 업데이트
        migration.enumerateObjects(ofType: SomeModelObject.className()) { oldObject, newObject in
            //'createdBy' 속성 추가
            newObject?["createdBy"] = Date()
            // 만약 이전 객체의 데이터를 기반으로 새로운 속성을 설정해야 한다면, oldObject를 사용할 수 있습니다.
        }
    }
}

마이그레이션을 추가할수록 새로운 Realm에대한 버전별 예외처리는 계속 늘어날 수 밖에없으니 처음부터 신중하는게 좋을것 같아요!

SampleCode

https://github.com/Kim-Jiny/RealmSample

profile
iOS developer

0개의 댓글