2
1

More than 1 year has passed since last update.

Core DataのEntityが持つAttributesの初期値は基本GUIで設定して必要だったらawakeFromInsertで記載する

Posted at

はじめに

Core DataのEntityが持つAttributesは初期値をXcodeのGUI(.xcdatamodeld)で設定できます。NSManagedObjectのメソッドawakeFromInsertではInsert時の値を入れることもできるので同じ値を重複して入れることで紛らわしいと感じるかもしれません。

初期値をどうするかはあらかじめ整理しておくと良いのではないかと思ってこの記事を書いてみました。コメントなりでご意見を
ください。

最初に結論

基本はデフォルト値をGUIで設定し、どうしても必要だったら重複する値をawakeFromInsertで設定する。

  • awakeFromInsertで設定する初期値
    • SHOULD
      • insert時に計算したい固定値でLight Weight Migrationで追加しない最初からあるAttributes
          • UUID().uuidString
          • Date()

前提

  • XcodeのGUIからはデフォルト値を決められる
    • DBマイグレーション時に新規にAttribute(カラム)が増やされたらこのデフォルト値が詰められる
  • awakeFromInsertメソッドはデフォルト値ではなくinsert時の値をまとめられる
    • DBマイグレーション時に新規にAttribute(カラム)が増やされてもinsertではないためこの値は使われない

実例

class MemoEntity: NSManagedObject {    
    // 最初から存在した値達 ---
    @NSManaged var id: String
    @NSManaged var createdDate: Date

    // Light Weight Migrationで追加された値達 ---
    @NSManaged var isDeleted: Bool // どうしても必須なものを追加。これはGUIで設定。awakeFromInsertだけでは駄目
    @NSManaged var body: String? // 基本的には必須感でなくていいならOptionalでいい
}
    override public func awakeFromInsert() {
        super.awakeFromInsert()
        // 最初から存在し、計算した値を入れたい
        id = UUID().uuidString // GUIからはUUID生成なんてできない。GUI上には空文字列""を入れる
        createdDate = Date() // GUIから現在日付は入れられない。GUI上には適当な日付を入れる

        isDeleted = false // 書かないでほしい。GUI上で設定必須なのにさらにコードで書いてしまい双方の値が異なる場合はまぎらわしい 👎
        // body: Optionalなので必要がなければ何も設定しない 👍
    }

その他

Appleのサンプルコードを見るとすべてOptionalになってて参考にならないですね。Optionalにしてもいいんだけど、利用側がそこで値がnilの場合にどんなハンドリングしたらよいかわからないので、型のレベルで表現してあげるほうがミスも迷いもなくシンプルだと思うんですが。

サンプルの"LoadingAndDisplayingALargeDataFeed"から引用

スクリーンショット 2021-10-18 15.52.24.png

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1