はじめに
Core DataのEntityが持つAttributesは初期値をXcodeのGUI(.xcdatamodeld)で設定できます。NSManagedObject
のメソッドawakeFromInsert
ではInsert時の値を入れることもできるので同じ値を重複して入れることで紛らわしいと感じるかもしれません。
初期値をどうするかはあらかじめ整理しておくと良いのではないかと思ってこの記事を書いてみました。コメントなりでご意見を
ください。
最初に結論
基本はデフォルト値をGUIで設定し、どうしても必要だったら重複する値をawakeFromInsert
で設定する。
- awakeFromInsertで設定する初期値
- SHOULD
- insert時に計算したい固定値でLight Weight Migrationで追加しない最初からあるAttributes
- 例
- UUID().uuidString
- Date()
- 例
- insert時に計算したい固定値でLight Weight Migrationで追加しない最初からあるAttributes
- SHOULD
前提
- 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"から引用