Realm 데이터베이스를 다음과 같은 Schema로 사용하고 있었습니다.
이 Schema에 데이터 생성일자 컬럼을 추가하고 싶어 다음과 같이 Model객체를 수정하였습니다.
//
// LocationInfo.swift
// Sample
//
// Created by francis on 2020/04/10.
// Copyright © 2020 Aircook. All rights reserved.
//
import RealmSwift
@objcMembers class LocationInfo: Object, NSCopying {
dynamic var id: Int = 0
dynamic var latitude: String = "0.0000000"
dynamic var longitude: String = "0.0000000"
dynamic var created: Date = Date() // 추가
func copy(with zone: NSZone? = nil) -> Any {
let copy = LocationInfo()
copy.latitude = self.latitude
copy.longitude = self.longitude
copy.created = self.created // 추가
return copy
}
override static func primaryKey() -> String? {
return "id"
}
func autoIncrementKey() -> Int {
let realm = try! Realm()
return (realm.objects(LocationInfo.self).max(ofProperty: "id") as Int? ?? 0) + 1
}
}
실행했더니 다음과 같은 오류메시지가 나옵니다. 자동으로 될줄 알았는데 그렇지는 않네요.
Fatal error: 'try!' expression unexpectedly raised an error: Error Domain=io.realm Code=10 "Migration is required due to the following errors:
- Property 'LocationInfo.created' has been added." UserInfo={NSLocalizedDescription=Migration is required due to the following errors:
- Property 'LocationInfo.created' has been added., Error Code=10}: file /Users/francis/project/study/ios/Sample/Sample/TableViewController.swift, line 30
메시지를 보면 Migration이 필요하다고 나오네요. 방법은 다음 링크에서 찾았습니다.
https://realm.io/docs/swift/latest/#migrations
위 링크의 내용을 참조하여 AppDelegate.swift 파일에 다음과 같이 Migration관련 코드를 작성하였습니다.
/* schemaVerion 0
dynamic var id: Int = 0
dynamic var latitude: String = "0.0000000"
dynamic var longitude: String = "0.0000000"
*/
/* schemaVerion 1
dynamic var id: Int = 0
dynamic var latitude: String = "0.0000000"
dynamic var longitude: String = "0.0000000"
dynamic var created: Date = Date()
*/
//Realm Migration
let config = Realm.Configuration (
// 새로운 스키마 버전을 셋팅한다. 이 값은 이전에 사용했던 버전보다 반드시 커야 된다.
schemaVersion: 1,
// 셋팅한 스키마 버전보다 낮을때 자동으로 호출되는 코드 블럭을 셋팅한다.
migrationBlock: { migration, oldSchemaVersion in
if (oldSchemaVersion < 1) {
migration.enumerateObjects(ofType: LocationInfo.className()) { oldObject, newObject in
newObject!["created"] = Date()
}
}
}
)
// 새로운 설정을 기본 저장소에 적용
Realm.Configuration.defaultConfiguration = config
다음과 같이 Schema가 변경되어 있는것을 확인 할 수 있습니다.
'ios' 카테고리의 다른 글
위치서비스를 위한 권한 상태값 가져오기 (0) | 2020.04.20 |
---|---|
Location updates in Background Modes (0) | 2020.04.19 |
Use Realm in Swift (0) | 2020.04.17 |
Tab Bar 사라지게 하는 방법 (0) | 2020.04.03 |
WKWebView (5) | 2018.02.14 |