SwiftUIでコアデータを使用するための概要
Introduction to using Core Data with SwiftUI
NSManagedObjectObservableObjectプロトコルに準拠しています。つまり、任意のオブジェクトをユーザーインターフェイスの一部にバインドできます。
managedObjectContextアクティブなCoreData管理対象オブジェクトコンテキストを格納するように設計された環境にはキーがあります。
次に、Xcodeのテンプレートは、そのコンテキストをシーンデリゲート内の最初のコンテンツビューに挿入します。
@FetchRequest環境の管理対象オブジェクトコンテキストを使用してフェッチ要求を実行するプロパティラッパーがあります。
そのため、アプリの起動時に管理対象オブジェクトコンテキストを作成し、それをビューの環境にアタッチしてから、を使用@FetchRequestしてアプリが使用するデータを読み込みます。
SwiftUIで動作するようにCoreDataを構成する方法
How to configure Core Data to work with SwiftUI
旧AppDelegate版のため以下を参考。
Day 53: Xcode 12 beta 3/ beta 4 and Core Data, impossible to select coredata checkbox
53日目:Xcode12ベータ3 /ベータ4およびCoreData、coredataチェックボックスを選択できません
import SwiftUI import CoreData public class PersistentCloudKitContainer { // MARK: - Define Constants / Variables public static var context: NSManagedObjectContext { return persistentContainer.viewContext } // MARK: - Initializer private init() {} // MARK: - Core Data stack public static var persistentContainer: NSPersistentContainer = { let container = NSPersistentContainer(name: "Bookworm") container.loadPersistentStores(completionHandler: { (storeDescription, error) in if let error = error as NSError? { fatalError("Unresolved error \(error), \(error.userInfo)") } }) container.viewContext.automaticallyMergesChangesFromParent = true container.viewContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy return container }() // MARK: - Core Data Saving support public static func saveContext () { let context = persistentContainer.viewContext if context.hasChanges { do { try context.save() } catch { let nserror = error as NSError fatalError("Unresolved error \(nserror), \(nserror.userInfo)") } } } } @main struct BookwormApp: App { let context = PersistentCloudKitContainer.persistentContainer.viewContext var body: some Scene { WindowGroup { ContentView().environment(\.managedObjectContext, context) } } }
@FetchRequestを使用してCoreDataフェッチリクエストを作成する方法
How to create a Core Data fetch request using @FetchRequest
述語を使用してCoreDataフェッチ要求をフィルタリングする方法
How to filter Core Data fetch requests using a predicate
SwiftUIビューからCoreDataオブジェクトを追加する方法
How to add Core Data objects from SwiftUI views
SwiftUIビューからCoreDataオブジェクトを削除する方法
How to delete Core Data objects from SwiftUI views
import SwiftUI import CoreData public class PersistentCloudKitContainer { // MARK: - Define Constants / Variables public static var context: NSManagedObjectContext { return persistentContainer.viewContext } // MARK: - Initializer private init() {} // MARK: - Core Data stack public static var persistentContainer: NSPersistentContainer = { let container = NSPersistentContainer(name: "ProgrammingLanguage") container.loadPersistentStores(completionHandler: { (storeDescription, error) in if let error = error as NSError? { fatalError("Unresolved error \(error), \(error.userInfo)") } }) container.viewContext.automaticallyMergesChangesFromParent = true container.viewContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy return container }() // MARK: - Core Data Saving support public static func saveContext () { let context = persistentContainer.viewContext if context.hasChanges { do { try context.save() } catch { let nserror = error as NSError fatalError("Unresolved error \(nserror), \(nserror.userInfo)") } } } } @main struct SwiftUITestApp: App { let context = PersistentCloudKitContainer.persistentContainer.viewContext var body: some Scene { WindowGroup { ContentView().environment(\.managedObjectContext, context) } } }
//----------------------------------- //----------------------------------- struct ContentView : View { @Environment(\.managedObjectContext) var managedObjectContext @FetchRequest( entity: PLEntity.entity(), sortDescriptors: [ //NSSortDescriptor(keyPath: \PLEntity.name, ascending: false), //NSSortDescriptor(keyPath: \PLEntity.creator, ascending: false) NSSortDescriptor(keyPath: \PLEntity.name, ascending: true) ] //predicate: NSPredicate(format: "name == %@", "Python") ) var languages: FetchedResults<PLEntity> func removeLanguages(at offsets: IndexSet) { for index in offsets { let language = languages[index] managedObjectContext.delete(language) } do { try managedObjectContext.save() } catch { // handle the Core Data error } } var body: some View { NavigationView { VStack{ //------------------------------- Button(action: { let language1 = PLEntity(context: self.managedObjectContext) language1.name = "Python" language1.creator = "Guido van Rossum" let language2 = PLEntity(context: self.managedObjectContext) language2.name = "Bird" language2.creator = "abcdefghijklmnopqrstuv" // more code here if self.managedObjectContext.hasChanges {do { try self.managedObjectContext.save() } catch { // handle the Core Data error } } }) { Text("Insert example language") } //------------------------------- List { ForEach(languages, id: \.self) { language in Text("Creator: \(language.name ?? "name")") Text("Creator: \(language.creator ?? "Anonymous")") }.onDelete(perform: removeLanguages) } //------------------------------- } .navigationBarTitle(Text("SwiftUI")) .navigationBarItems(trailing: EditButton()) } } } //----------------------------------- //----------------------------------- struct ContentView_Previews: PreviewProvider { static var previews: some View { let context = PersistentCloudKitContainer.persistentContainer.viewContext //ContentView() return ContentView().environment(\.managedObjectContext, context) } }
FileDocumentとDocumentGroupを使用してドキュメントベースのアプリを作成する方法
How to create a document-based app using FileDocument and DocumentGroup
動作不可 おそらく、appleの仕様変更?
参考サイト
忙しい人向けの Build document-based apps in SwiftUI – #WWDC20
以下サイトのリンクは動作!!
FileDocument | ReferenceFileDocument – SwiftUI
ExportFilesActionを使用してファイルをエクスポートする方法
How to export files using ExportFilesAction
SwiftUIでのファイルのインポートとエクスポート
掲載情報だけでは動作不可
以下 参考サイト
WWDC 2020で、SwiftUIは、新しい@Environment変数を使用して、アプリケーションとの間でデータをインポートおよびエクスポートするための機能を導入しました。これらの新しい追加はSwiftUIの歓迎すべき改善ですが、少し不格好です。iOS 14ベータ6のリリースに伴い、Appleはインポートとエクスポートの摩擦を減らす新しいビュー修飾子のセットを提供してくれました。
githubダウンロード版もそのままで動作不可
SwiftUIでのファイルのインポートとエクスポート
SwiftUIでNSUserActivityを継続する方法
How to continue an NSUserActivity in SwiftUI
SwiftUIには、Webからのクリック、SpotlightまたはSiriからの起動などonContinueUserActivity()、さまざまなNSUserActivityタイプをキャッチできる専用の修飾子があります。
今後の宿題