Realmのマイグレーション後のApp Storeでのアップデートの挙動について
初めてSwiftとRealmで本格的にプログラムを書き、iPhoneアプリをなんとかApp Storeでリリースできましたが、Realmの処理方法を変更したいと考えています。
マイグレーション処理を挿入し、Xcodeでビルドアップしたところ、こんなエラーが表示されました。
Property 'hoge' has been added to latest object model.
とりあえずは、アプリを丸ごと削除して再ビルドアップすることで問題はクリアできましたが、ふと、思ったのは新バージョンをApp Storeにアップロードし、ユーザーがアップデートした場合も
このエラーが発生しないのだろうかということです。
もし自分が考えたようにエラーが出てユーザーがアプリを削除、再インストールするとなると、それまで登録していたデータがなくなるのは目に見えてるのですが、実際の挙動は問題なくアップデートできるのでしょうか?
サンプルのコードです。
// DataModel.swift
import RealmSwift
class event: Object {
dynamic var eventID:Int = 0
dynamic var eventTitle:String?
// 新しく追加するプロパティ
dynamic var hoge = 0
override static func primaryKey() -> String? {
return "eventID"
}
}
// AppDelegate.swift
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
let config = Realm.Configuration(
schemaVersion: 1,
migrationBlock: { migration, oldSchemaVersion in
if (oldSchemaVersion < 1) {
}
})
Realm.Configuration.defaultConfiguration = config
return true
}
func applicationWillEnterForeground(application: UIApplication) {
NSNotificationCenter.defaultCenter().postNotificationName("appWillEnterForeground", object: nil)
}
// ViewController
class ViewController: UIViewController {
var realmURL:NSURL?
override func viewDidLoad() {
super.viewDidLoad()
setRealmURL()
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(ViewController.viewWillEnterForeground(_:)), name: "appWillEnterForeground", object: nil)
let realm = try! Realm(fileURL: realmURL!)
let rlm = event()
rlm.eventID = 0
rlm.eventTitle = "First Title"
try! realm.write {
realm.add(rlm, update: true)
}
print(realm.objects(event))
}
func setRealmURL() {
var fileName = ""
let defaults = NSUserDefaults.standardUserDefaults()
let fileNum = defaults.integerForKey("realmFileNum")
if fileNum == 0 {
fileName = "f0.realm"
} else {
fileName = "f1.realm"
}
var config = Realm.Configuration()
config.fileURL = config.fileURL!.URLByDeletingLastPathComponent?.URLByAppendingPathComponent(fileName)
Realm.Configuration.defaultConfiguration = config
realmURL = config.fileURL!
}
func compactionFile(URL: NSURL) {
let oldRealmURL = URL
var newRealmURL:NSURL!
let defaults = NSUserDefaults.standardUserDefaults()
let fileNum = defaults.integerForKey("realmFileNum")
if fileNum == 0 {
newRealmURL = oldRealmURL.URLByDeletingLastPathComponent!.URLByAppendingPathComponent("f1.realm")
defaults.setInteger(1, forKey: "realmFileNum")
} else {
newRealmURL = oldRealmURL.URLByDeletingLastPathComponent!.URLByAppendingPathComponent("f0.realm")
defaults.setInteger(0, forKey: "realmFileNum")
}
let realm = try! Realm(fileURL: oldRealmURL)
do {
try realm.writeCopyToURL(newRealmURL)
} catch {
}
var config = Realm.Configuration()
config.fileURL = newRealmURL
Realm.Configuration.defaultConfiguration = config
try! NSFileManager.defaultManager().removeItemAtURL(oldRealmURL)
}
func viewWillEnterForeground(notification: NSNotification?) {
compactionFile(realmURL!)
setRealmURL()
print("realmURL = ",realmURL)
print("schemaVersionAtURL = ",try! schemaVersionAtURL(realmURL!))
}
}