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タイプをキャッチできる専用の修飾子があります。
今後の宿題