top of page

アプリを手作りしています

ホーム: ようこそ!
ホーム: Blog2

[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


©2020 by Handmade App. Proudly created with Wix.com

bottom of page