この記事ではSwitt/SwiftUIのアプリからCoreDataへデータを作成・削除する方法について記載します。
皆様のアプリ開発に役立てるように分かりやすく、実際のアプリの動き、コードから解説していきます。
実行画面
以下が今回説明に使用する処理画面になります。
動画でCoreDataを使用している注目ポイントを説明します。
– 投稿を押下し、中身を確認する画面へ遷移
– いいね(ハートマークを押す)
– 投稿一覧画面に戻るといいねを押した投稿のいいね数が1増える(0→1)
– 先ほどの投稿の中身を確認する画面に遷移するといいね(ハート)がついた状態で表示される
– いいねを外すといいね数が1減り(1→0)、投稿の中身画面でもハートの色が消える
つまり、CoreDataでユーザーが特定の投稿にいいねをしているか否かの状態を管理しています。
CoreData
CoreDataとは
Core Dataは、Appleが提供するデータの永続化(データを永続的に保存すること)と、データの管理に関するフレームワークです。Core DataはiOS、macOS、watchOS、tvOSなどのAppleプラットフォームで利用できます。主な目的は、アプリケーションのデータモデルを定義し、データの作成、読み取り、更新、削除などを効率的に行うことです。
データ構造
以下が実際のデータ構造を表した画面になります。
ENTITI:データモデル内でデータの構造を定義し、データベース内のテーブルのようなもの
Attributes:エンティティの特定のデータ要素
Type:データ型
CoreDataの概念がこちらのサイトで分かりやすく書かれていたので知りたい方はご覧ください。
解説
ここからは実際のコードを参考に使い方を解説していきます。
ビュー画面
import SwiftUI
struct ThreadInside: View {
//前画面から引き継いだ値
@Binding var id: String
@Binding var post_name: String
@Binding var title: String
@Binding var threadname: String
@Binding var tf : Bool
@Binding var report: String
@Binding var date: Date
@Binding var selectedImaged:Data
//CoreDataのENTITI:ManageのAttributesのデータを取得。managesにはManageのインスタンスが含まれている。
@FetchRequest(sortDescriptors: []) var manages: FetchedResults<Manage>
//CloudKitのデータ更新の使用する
@StateObject var viewModel = ThreadinListViewModel()
//CoreDataのデータ更新に使用する。
@ObservedObject var db_Model : DB_Model
//managedObjectContextというCoreDataマネージドオブジェクトコンテキストを viewContextというプライベートなプロパティにバインド。viewContextを使用してCore Data とやり取りを行う。
@Environment(\.managedObjectContext) private var viewContext
var body: some View {
//いいねを押している状態の場合
if tf {
//CloudKit,CoreDataのデータを更新する処理
Button(action: {
Task {
await viewModel.updatedb_good(threadId: id, tf: tf, threadname: threadname)
}
tf = false
addManage()
}){
HStack {
Spacer()
//色付きのハート
Image(systemName: "heart.fill").font(.system(size: 25)).foregroundColor(.red).padding(EdgeInsets(top: 10, leading: 0, bottom: 4, trailing: 25))
}
}
//いいねを押していない状態の場合
} else {
Button(action: {
Task {
await viewModel.updatedb_good(threadId: id, tf: tf, threadname: threadname)
}
tf = true
addManage()
}){
Spacer()
//色無のハート
Image(systemName: "heart").font(.system(size: 25)).foregroundColor(.red).padding(EdgeInsets(top: 10, leading: 0, bottom: 4, trailing: 25))
}
}
}
}
作成
CoreDataのENTITIへデータを作成します。(本当の動きはエンティティのインスタンスを作成し、データを追加する)
func addManage() {
//てUIの変更をアニメーション化する→スムーズなユーザーエクスペリエンスを提供
withAnimation {
//新しいManageエンティティのインスタンスを作成
let newManage = Manage(context: viewContext)
//プロパティへ値をセット
newManage.thread_id = id
newManage.post_name = post_name
newManage.title = title
newManage.threadname = threadname
newManage.good_state = tf
newManage.report = report
newManage.timestamp = date
newManage.imagedata = selectedImaged
//データベースへ保存。エラーハンドリング処理
do {
try viewContext.save()
} catch {
let nsError = error as NSError
fatalError("Unresolved error \(nsError), \(nsError.userInfo)")
}
}
}
削除
CoreDataの特定ENTITIのデータを削除する
func deleteManage() {
//manages内の各Manageインスタンスを格納していく
for manage in manages {
//Manageインスタンスを削除していく
viewContext.delete(manage)
}
do {
try viewContext.save()
} catch {
fatalError("セーブに失敗")
}
}
更新については長くなるため以下の記事で紹介しております。
以上がCoreDataを用いたデータの作成・削除のソースコードになります。
サンプリとして利用いただき、トライアンドエラーで少しずつ理解していくのがお勧めです。
コメント