この記事ではSwitt/SwiftUIのアプリからCoreDataへデータを更新する方法について記載します。
こちらの記事を読む前にビューの情報は以下の記事にあるので最初に読んでいただくことを薦めします。
準備(NSManagedObject Subclassの作成)
CoreDataのコンソールで以下の作業を行う。

・特定のENTITIを選択し、Codegenの値をManual/Noneに変更
・Xcodeのメニューから Editor -> Create NSManagedObject Subclass を選択する
・CoreDataのファイル名 -> 特定のENTITIを選択してcreat
プログラム
前段の作業でNSManagedObject Subclassが作成される。
それに加え、@NSManaged
プロパティから値を取得してラップし、デフォルト値を設定するプロパティを定義する。
import Foundation
import CoreData
extension Manage {
//エンティティに対するNSFetchRequestを作成して返すメソッド。このメソッドは、Core Dataからエンティティのデータを取得するために使用
@nonobjc public class func fetchRequest() -> NSFetchRequest<Manage> {
return NSFetchRequest<Manage>(entityName: "Manage")
}
//CoreDataによって管理されるプロパティ
@NSManaged public var good_state: Bool
@NSManaged public var imagedata: Data?
@NSManaged public var post_name: String?
@NSManaged public var report: String?
@NSManaged public var thread_id: String?
@NSManaged public var threadname: String?
@NSManaged public var timestamp: Date?
@NSManaged public var title: String?
}
////////////以下を追加////////////////
//@NSManagedプロパティをオプショナルから非オプショナルに変換するための計算型プロパティ。(nilの場合はデフォルトの値が使用される。)
extension Manage {
public var wrappedPost_Name: String {post_name ?? ""}
public var wrappedTitle: String {title ?? ""}
public var wrappedPost_ThreadName: String {threadname ?? ""}
public var wrappedThread_id: String {thread_id ?? ""}
public var wrappedDate: Date {timestamp ?? Date()}
public var wrappedReport: String {report ?? ""}
public var wrappedImg: Data {imagedata ?? Data.init(capacity: 0)}
}
DBを更新するために使用するクラスを定義するプログラムを作成
import Foundation
import SwiftUI
import CoreData
class DB_Model : ObservableObject{
//いいねの状態を格納する変数
@Published var good_state = false
//前述のENTITI:Manageのデータ型を定義
@Published var updateManage : Manage!
//データが新規か編集かで処理を分けるために関数を2つ作成
func writeManage(context :NSManagedObjectContext){
//新規データ作成の時は処理されない
if updateManage != nil {
//関数editManage()で取得したインスタンスを更新
updateManage.good_state = good_state
try! context.save()
good_state = false
return
}
}
//編集の時は既存データを利用する
func editManage(item: Manage){
//特定のインスタンスを格納
updateManage = item
good_state = item.good_state
}
}
上記を実行するための処理プログラム
func addManage() {
for manage in manages {
if manage.post_name == post_name && manage.title! == title {
manage.good_state = tf
db_Model.editManage(item: manage)
db_Model.writeManage(context: viewContext)
}
}
}
以上がCoreDataを用いてデータを更新するソースコードになります。
サンプリとして利用いただき、トライアンドエラーで少しずつ理解していくのがお勧めです。
コメント