前提
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として格納されます)
実現したいこと
- DatePickerで日付を入力し、selectedDateに格納
- TextFieldでイベント内容を入力し、addEventに格納後、
- "入力" ボタンを押すと、
- selectedDateの時刻を00:00:00に変えて
- CoreData に
a: リストにない新しい日付の場合は、CoreDataにデータを追加
b: 同じ日付がリストにある場合は、eventの中身を新しい内容に変更
としたいと考えています。
発生している問題・エラーメッセージ
5)-a までは動作を確認した(下記ソースコード)のですが、
5)-b をどうすれば実現できるかがわかりません。
要は、2022/10/1 「なし狩り」と入力されたら、CoreDataに4つ目のデータとして追加され、
2022/9/1 「なし狩り」と入力されたら、「ぶどう狩り」→「なし狩り」に3つ目のデータを変更したいというものです。
private func updateEvents() { } の中身に「追加の場合」だけでなく「変更の場合」を組み込みたいのですが、どなたか解決策をいただけると大変ありがたいです。よろしくお願いいたします。
(CoreData導入に関わるソースコードは煩雑になるので記入しておりません)
エラーメッセージはありません
該当のソースコード
SwiftUI
1import SwiftUI 2 3struct InputViewCoreData: View { 4 @Environment(\.managedObjectContext) private var viewContext 5 @State private var selectedDate = Date() 6 @State private var addEvent = "" 7 8 @FetchRequest( 9 entity: Events.entity(), 10 sortDescriptors: [NSSortDescriptor(key: "dateId", ascending: false)], 11 animation: .default 12 ) var fetchedEventsList: FetchedResults<Events> 13 14 var body: some View { 15 VStack { 16 Text("日付").font(.title).padding() 17 HStack { 18 DatePicker("", selection: $selectedDate, displayedComponents: .date) 19 .labelsHidden() 20 TextField("イベントを入力", text: $addEvent) 21 .textFieldStyle(RoundedBorderTextFieldStyle()) 22 Button(action: { updateEvents() } ) { 23 Text("入力").buttonStyle(BorderlessButtonStyle()) 24 } 25 } .padding() 26 27 List { 28 ForEach(fetchedEventsList) { events in 29 HStack { 30 Text(events.stringDateId) // stringDateId: String { dateFomatter(date: dateId ?? Date()) } 31 Text(events.event ?? "") 32 } 33 } 34 .onDelete(perform: deleteEvents) 35 } 36 } 37 } 38 39 private func updateEvents() { 40 let events = Events(context: viewContext) 41 selectedDate = dateToJstDate(date: selectedDate) 42 43 events.dateId = selectedDate 44 events.event = addEvent 45 46 try? viewContext.save() 47 } 48 49 private func deleteEvents(offsets: IndexSet) { 50 offsets.forEach { index in 51 viewContext.delete(fetchedEventsList[index]) 52 } 53 try? viewContext.save() 54 } 55 56 private func dateToJstDate(date: Date) -> Date { 57 let calendar = Calendar(identifier: .gregorian) 58 59 return calendar.date(from: DateComponents( 60 year: Calendar.current.component(.year, from: date), 61 month: Calendar.current.component(.month, from: date), 62 day: Calendar.current.component(.day, from: date)))! 63 } 64 65 struct InputViewCoreData_Previews: PreviewProvider { 66 static var previews: some View { 67 InputViewCoreData().environment(\.managedObjectContext, PersistenceController.preview.container.viewContext) 68 } 69 } 70}
試したこと
ネット情報でCoreData検索に関するものを見てみましたが、いまいちしっくりくるものがありませんでした。
補足情報(FW/ツールのバージョンなど)
Xcode 13.4.1
回答1件
あなたの回答
tips
プレビュー