본문 바로가기

ios

Migration in Realm

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

 

Realm: Create reactive mobile apps in a fraction of the time

Realm Swift is the first database built for mobile. An alternative to SQLite and Core Data that's fast, easy to use, and open source.

realm.io

위 링크의 내용을 참조하여 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