[SwiftUI]What I wear counter/着た回数カウンタ - (5) CoreData One-to-Many Relationship
- handmadeapp
- 2020年2月15日
- 読了時間: 2分
更新日:2020年2月18日
着た回数カウントアプリの続きで、CoreDataに子エンティティを追加します。
Item毎の洗った履歴(いつ、何回着た後に)を残せるように。
Itemが親、Washが子になる、One-to-ManyのRelationshipです。
まずは、CoreDataのエンティティにWashを追加し、Relationshipを設定。

こちらの記事を参考に、親のItem側に、子のWashをwashArrayとして持たせることに。
Editor > Create NSManagedObject Subclassで作成した
「Item+CoreDataProperties.swift」で、
@NSManaged public var wash: Wash?
=> @NSManaged public var wash: NSSet?
に変更し、
を追記。
(1)登録 - Create
Detail Viewから、そのItemのWashレコードを登録できるように。
「Record wash」のボタンタップで、今日の日付でWashを登録したい。

「Record wash」ボタンタップ時に呼び出すFunctionを作成。
item.last_wash_dateはString型で、yyyy/MM/dd の文字列を保存するので、
Utilityにフォーマット変換を準備して利用。
Utilityクラス。
「Record wash」ボタンのアクションから呼び出し。
(2)表示 - Read
Detail Viewに、そのItemのWashレコードをリスト表示できるように。
「いつ、何回着た後に」洗ったか、の記録を一覧で表示したい。

親のItemに用意した、washArrayをForEachでリストに。
(1)で使ったUtilityのdateFormatも活用。
これでOK。
(3)削除 - Delete
Detail Viewに、そのItemのWashレコードを選択削除できるように。
選択されたWashレコード(子)を削除するのに加えて、Itemレコード(親)の、
・Washカウント(count_all_wash)を -1
・最終Wash日(last_wash_date)を削除後のWashの中で最近の日付に更新
が必要。
Washレコード削除と、それに伴うItemレコード更新のFunctionを準備。
ここでも、last_wash_dateの更新に(1)で使ったUtilityのdateFormatを活用。
これを、Washレコード一覧のonDeleteアクションに追加。
ただ、なぜかWashレコード行の削除がすぐに反映されないという問題が。。
Delete後も一覧の表示は変わらないものの、Detail Viewを再度表示すると削除済み。
CoreDataの更新はされているが、Viewにリアルタイムでは反映されない?
結局、Delete後にAlertを入れると、Alertを閉じた際に一覧が更新されるように。
次は、Detail Viewのその他更新部分を作っていこうと思います。
Comments