【アプリ開発】CoreDataのレコード情報を更新(Swift/SwiftUI)

App

この記事では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を用いてデータを更新するソースコードになります。
サンプリとして利用いただき、トライアンドエラーで少しずつ理解していくのがお勧めです。

アプリ”NowShare”をダウンロード
情報共有アプリ"NowShare"
今からみんなでナレッジ共有! 本当に欲しい情報をキャッチ&リリース 教えてあげたい情報を知りたい人にすぐに共有。 ためになった情報にはいいねを押して盛り上げよう!
Appエンジニア
ナスジニアをフォローする
🍆ナスジニアのブログ(iPhoneアプリ開発)

コメント

タイトルとURLをコピーしました