CoreDataでcreated_at/updated_atの日付データを自動作成

スポンサーリンク

Ruby on Rails の ActiveRecord と migration 機能を使いますと、デフォルトでデータベースのテーブルに created_at, updated_at のカラムが追加されます。さらに ActiveRecord オブジェクトを通してレコードを作成しますと、それらの created_at, updated_at カラムの日付データが自動的に作成されます。これと同じような機能を Swift & CoreData(MagicalRecord)による開発でも実現したかった。

— 環境 —
Swift 1.2
Xcode 6.3.2

【お知らせ】 英単語を画像イメージで楽に暗記できる辞書サイトを作りました。英語学習中の方は、ぜひご利用ください!
画像付き英語辞書 Imagict | 英単語をイメージで暗記
【開発記録】
英単語を画像イメージで暗記できる英語辞書サービスを作って公開しました
スポンサーリンク

NSManagedObject の awakeFromInsert() をオーバーライド

Profile モデル(エンティティ)に、created_at, updated_at の属性を作成済みの前提です。

Screen Shot 2015-07-03 at 10.26.00

NSManagedObject の awakeFromInsert() をオーバーライドすることで、CoreData モデル属性の初期値を設定することができます。

Profile.swift

これで上手く動作しまして、Profile モデルのオブジェクト作成時に created_at および updated_at に現在の日時が初期値として設定されます。以下のエントリー等を参考にしました。

CoreData の 属性に現在時刻など固定値以外のデフォルト値を設定する – 24/7 twenty-four seven
Cocoa – Core Dataのエンティティ生成時に自動的に項目を登録 – Qiita

レコード更新時の updated_at の自動更新について

ActiveRecord の場合ですと、オブジェクト(DBレコード)の更新時に updated_at カラムを自動更新する機能もあるのですけど、今回はこちらについては必要なさそうだったので深追いしませんでした。

NSManagedObject に awakeFromUpdate() のメソッドが用意してあれば、以下のようにオーバーライドして簡単に実現できそうなのですけどね…。あいにく awakeFromUpdate() なるものは用意されていないようです。

updated_at 自動更新の機能を実装するとしたら、CoreData(または MagicalRecord)のオブジェクトを更新して保存する既存メソッドの処理の前に、オブジェクトの updated_at を現在日時に変更する処理を追加する形になるかと思います。別メソッドとして定義して更新時にそれを使うようにするか、可能であれば既存メソッドをオーバーライドするか。詳しくは調べていません。

スポンサーリンク
 
スポンサーリンク

Leave Your Message!