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()
}
}
그리고 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에대한 버전별 예외처리는 계속 늘어날 수 밖에없으니 처음부터 신중하는게 좋을것 같아요!
https://github.com/Kim-Jiny/RealmSample