4

私は次のモデルを持っています

class Area: Object {

// Specify properties to ignore (Realm won't persist these)

//  override static func ignoredProperties() -> [String] {
//    return []
//  }

    dynamic var id = 0
    dynamic var name = ""

    override static func primaryKey() -> String? {
        return "id"
    }

}

class Region: Object {

// Specify properties to ignore (Realm won't persist these)

//  override static func ignoredProperties() -> [String] {
//    return []
//  }

    dynamic var id = 0
    dynamic var name = ""

    override static func primaryKey() -> String? {
        return "id"
    }

}

let areas = List<Area>()Region クラスとArea クラスに追加したいのdynamic var region: Region?ですが、移行ブロックの実行方法を教えてください。移行ドキュメントの例は、プリミティブ型のデモのみを行っているためです。

4

2 に答える 2

1

明確化を受けて編集

わかりました。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 がユーザーに代わって作業するようにすることができます。RegionArealinkingObjects(_: 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 つでそれを使用しています。:))

于 2015-12-16T13:16:36.590 に答える