2016-11-10 3 views
0

オプションのNSDateプロパティexpiryDateを持つRealmモデルがあります。このモデルには、後でオブジェクトを使用できなくなる日付が格納されています。レルム;

このプロパティは、expiryDateが必要なように変更する必要があります。そこには複数のバージョンのアプリケーションがあるので、データレイヤーにある各オブジェクトのexpiryDateプロパティが設定されているかどうかをチェックする機能を持たないようにしたい場合は、それをデフォルト値に設定します。私はこの変更が設定されていないexpiryDate持つすべての以前に保存されたオブジェクトは、NSDate().dateByAddingSeconds(SomeMaxExpiryDateInSeconds)に設定されることを意味します

dynamic var expiryDate: NSDate = NSDate().dateByAddingSeconds(SomeMaxExpiryDateInSeconds) 

dynamic var expiryDate: NSDate? 

を置き換えるために、私たちのスキーマを更新することを計画

とレルムに応じて保存されますか?または、このプロパティはアクセスされるたびに再計算されますか?

答えて

0

レルムの移行中に、特定のプロパティをオプションにするか非オプションにするかの間など、値の型を変更することができます。移行中に、以前にnilだった各expiryDateオブジェクトに値を割り当てる必要があります。

Realm.Configuration.defaultConfiguration = Realm.Configuration(
    schemaVersion: 1, 
    migrationBlock: { migration, oldSchemaVersion in 
     if (oldSchemaVersion < 1) { 
      migration.enumerateObjects(ofType: Object.className()) { oldObject, newObject in 
       if oldObject["expiryDate"] == nil { 
        newObject["expiryDate"] = Date().dateByAddingSeconds(SomeMaxExpiryDateInSeconds) 
       } 
      } 
     } 
    }) 
+0

これは良い解決策であり、すでに私が考えていることです。この質問の中で述べたように、コードベースと冗長コードにコードを追加するので、このようなメソッドを使用したくありません。 iOS 9がどこにでも散っているのとほぼ同じです。同じ問題が当てはまります。問題を解決するために動的変数をデフォルト値で更新できますか? –

+0

残念ながら、Realmプロパティをオプションから非オプションに変換する場合は、移行を実行する必要があります。コード匂いのように見えて申し訳ありません。私たちは通常、RealmのConfigurationsファイルをConstantsファイルに置きます。そのため、コードベースには直接アクセスしないようにします。 'expiryDate'をオプションとして残しておくことができれば、この事実の後に作成された新しいオブジェクトのデフォルト値を変更することはできますが、' nil'の古いオブジェクトに対しては解決策が必要になります。 – TiM

+0

移行の代わりに、 'nil'期限の日付オブジェクトを持つすべてのオブジェクトに対してクエリを実行し、それらをワンオフとして更新することができます。 – TiM