2016-09-29 6 views
11

私のデータベースモデルには多くの日付フィールドがあります。 CoreDataでは、「Use Scalar Type」オプションに応じてNSDateまたはTimeIntervalを使用して日付を保存できます。CoreDataでSwiftの日付を使用

enter image description here

しかし、両方の私はDateオブジェクトとして日付を使用するため、これらのオプションは、私のために悪いです。 NSDateは暗黙的にDateに変換可能ではないので、値をDateにキャスト/変換するか、NSManagedObjectクラスで多くのカスタムセッター/ゲッターを実装する必要があります。

私はValueTransformerを使用しようとしましたが、Dateのような非@ objcクラスでは動作しません。

CoreDataとの間で値を保存してDateにする簡単な方法はありますか?

答えて

25

はい、あなたはそれが気に入らないかもしれません。コアデータの "日付"タイプを使用してプロパティを宣言した場合、XcodeはNSManagedObjectサブクラスを生成します。プロパティはの@NSManagedプロパティになります。あなたが理解したように、DateNSDateを対処しなければなりません。

あなたは(Xcodeの8セット「マニュアル/なし」を「codegenの」に)、あなたは

のようなものとしてCore Dataは、「日付」プロパティを宣言することができますXcodeのは、あなたのためのサブクラスを生成することはできませない 場合
@NSManaged public var timestamp: Date? 

これはうまくいくでしょう。 Dateの値を読み書きすることができ、コアデータが正しい処理を行います。しかし、サブクラスNSManagedObjectのコードは完全に責任を負うことになります。クラス全体を作成する必要があります。コアデータモデルを更新する場合は、クラスも更新する必要があります。これは価値があると思われるかどうかはあなた次第ですが、今のところ存在すると思われる唯一の解決策です。

更新:Xcode 9では、生成コードでDateが使用されているため、これ以上は必要ありません。

+1

それは、Xcodeの8.ファイルで、Appleと拡張要求の唯一の方法だし、多分それは将来のアップデートに取得します。 –

+0

CoreDataについての本を書いたことに気付きました。だから、別の解決策を待つ意味がないようです:)もう一度ありがとう。 – Avt

+4

"Editor - > Create NSManagedObjectSubclass"を選択すると、左側のモデルを選択するだけで、クラス全体を自分で作成するのではなく、 "Codegen"を "Manual/None"に設定することはできますか?あなたのためにクラスを作成します。それから、NSDateをDateに変更するだけです。モデルを更新するたびにこれを行う必要があります。 – oyalhi

3

変換可能に設定してカスタムクラスをDateに設定すると、それがうまく動作する回避策があります。

Transformable date

関連する問題