明確化を受けて編集
わかりました。areas
したがって、モデルに追加するときに事前入力したいので、結局、移行ブロックにいくつかのロジックを実装する必要があります。
let migrationBlock: MigrationBlock = { migration, oldSchemaVersion in
migration.enumerate(Region.className()) { oldObject, newObject in
if oldSchemaVersion < 1 {
let areas = newObject?["areas"] as? List<MigrationObject>
// Add new objects to 'areas' as needed
}
}
}
Realm Swift のサンプル コード コレクションには、マイグレーションで List オブジェクトを処理する方法を示すサンプル コードがいくつかあります。
region
プロパティを追加する目的が、これがどのオブジェクトの子でArea
あるかを見つけることである場合、それをモデル プロパティとして実装する必要はありません。代わりに、 Realm がユーザーに代わって作業するようにすることができます。Region
Area
linkingObjects(_: forProperty: )
class Area: Object {
dynamic var id = 0
dynamic var name = ""
var regions: [Region] {
return linkingObjects(Region.self, forProperty: "areas")
}
override static func primaryKey() -> String? {
return "id"
}
}
コメントで私が言ったことを確認するために、移行は一方通行です。以前のスキーマ バージョンにダウングレードすることはできません。Realm ファイルの移行プロセスを迅速にデバッグしたい場合は、元の Realm ファイルを脇に置き、コピーで作業することをお勧めします。
元の回答
これらの新しいプロパティに追加したいデータは実際にありますか? あなたのようには見えないので、移行ブロックにコードを実装する必要はありません。
Realm スキーマのバージョン番号を増やして、空の移行ブロックを指定するだけです。
let config = Realm.Configuration(
schemaVersion: 1,
migrationBlock: { migration, oldSchemaVersion in
})
Realm.Configuration.defaultConfiguration = config
移行ブロックを nil にすることはできませんが、古い Realm ファイルに移行中に操作したいデータがある場合 (つまり、別のプロパティに移動する場合) にのみ、そこにコードを配置する必要があります。まったく新しいプロパティを追加する場合、移行ブロック内でそれらに何もする必要はありません。
Realm の移行の考え方を理解するには少し時間がかかりますが、ありがたいことに、一度理解してみると、思ったよりも簡単であることがわかります。:)
(免責事項: 私は Realm で働いていますが、この時点で実際のユーザー データの複数の移行を試した、出荷中の自分の iOS アプリの 1 つでそれを使用しています。:))