質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.12%

解決済

【SwiftUI】CoreDataに 条件によってデータを追加または更新したい

kuwatsy
kuwatsy

総合スコア4

1回答

0リアクション

0クリップ

279閲覧

投稿2022/09/10 04:47

前提

SwiftUI初心者です。iPhone向けのアプリを開発すべく勉強中です。
CoreDataを実装する手順は理解したつもりです。

Entity名: Events
Attributes: dateID (Date), event (String) が登録されていて、すでにデータ

dateID  event
2022/1/1 初日の出
2022/5/1 山登り
2022/9/1 ぶどう狩り

がsaveされています。(dateIDは、常に時刻は00:00:00として格納されます)

実現したいこと

  1. DatePickerで日付を入力し、selectedDateに格納
  2. TextFieldでイベント内容を入力し、addEventに格納後、
  3. "入力" ボタンを押すと、
  4. selectedDateの時刻を00:00:00に変えて
  5. CoreData に
    a: リストにない新しい日付の場合は、CoreDataにデータを追加
    b: 同じ日付がリストにある場合は、eventの中身を新しい内容に変更

としたいと考えています。

発生している問題・エラーメッセージ

5)-a までは動作を確認した(下記ソースコード)のですが、
5)-b をどうすれば実現できるかがわかりません。

要は、2022/10/1 「なし狩り」と入力されたら、CoreDataに4つ目のデータとして追加され、
2022/9/1 「なし狩り」と入力されたら、「ぶどう狩り」→「なし狩り」に3つ目のデータを変更したいというものです。

private func updateEvents() { } の中身に「追加の場合」だけでなく「変更の場合」を組み込みたいのですが、どなたか解決策をいただけると大変ありがたいです。よろしくお願いいたします。
(CoreData導入に関わるソースコードは煩雑になるので記入しておりません)

エラーメッセージはありません

該当のソースコード

SwiftUI

import SwiftUI struct InputViewCoreData: View { @Environment(\.managedObjectContext) private var viewContext @State private var selectedDate = Date() @State private var addEvent = "" @FetchRequest( entity: Events.entity(), sortDescriptors: [NSSortDescriptor(key: "dateId", ascending: false)], animation: .default ) var fetchedEventsList: FetchedResults<Events> var body: some View { VStack { Text("日付").font(.title).padding() HStack { DatePicker("", selection: $selectedDate, displayedComponents: .date) .labelsHidden() TextField("イベントを入力", text: $addEvent) .textFieldStyle(RoundedBorderTextFieldStyle()) Button(action: { updateEvents() } ) { Text("入力").buttonStyle(BorderlessButtonStyle()) } } .padding() List { ForEach(fetchedEventsList) { events in HStack { Text(events.stringDateId) // stringDateId: String { dateFomatter(date: dateId ?? Date()) } Text(events.event ?? "") } } .onDelete(perform: deleteEvents) } } } private func updateEvents() { let events = Events(context: viewContext) selectedDate = dateToJstDate(date: selectedDate) events.dateId = selectedDate events.event = addEvent try? viewContext.save() } private func deleteEvents(offsets: IndexSet) { offsets.forEach { index in viewContext.delete(fetchedEventsList[index]) } try? viewContext.save() } private func dateToJstDate(date: Date) -> Date { let calendar = Calendar(identifier: .gregorian) return calendar.date(from: DateComponents( year: Calendar.current.component(.year, from: date), month: Calendar.current.component(.month, from: date), day: Calendar.current.component(.day, from: date)))! } struct InputViewCoreData_Previews: PreviewProvider { static var previews: some View { InputViewCoreData().environment(\.managedObjectContext, PersistenceController.preview.container.viewContext) } } }

試したこと

ネット情報でCoreData検索に関するものを見てみましたが、いまいちしっくりくるものがありませんでした。

補足情報(FW/ツールのバージョンなど)

Xcode 13.4.1

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

xg63ex2b

2022/09/10 08:39

しっくりこない回答をしてしまうかもしれませんので、、 どのようなコードがしっくりこないか、 質問欄に追記していただいてもよろしいでしょうか?
kuwatsy

2022/09/10 09:12

見ていただきましてありがとうございます。 しっくりいかないというか、勉強&理解不足でして、おそらくですけど fetchedEventList で、dateが2022/9/1の行のeventの値はどうすれば参照できるのか、がわかれば何とかなるのでは?と思っています。 fetchedEventList[date].eventではないと思いますが…

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.12%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る