LoginSignup
23
32

More than 3 years have passed since last update.

SwiftUIとCoreDataを@FetchRequestで連携させる

Last updated at Posted at 2019-11-05

データベースのデータをSwiftUIに表示したい場合、
データベースがCoreDataであれば、
@FetchRequestFetchedResults を使うことによって連携することができます。

FetchRequest

FetchRequestのドキュメント

FetchRequestのパラメータには sortDescriptorspredicate などが用意されていて、
@FetchRequest をFetchedResultsプロパティにつけることによってCoreData内のデータを取り出せます。
例えば、EntityというデータモデルをcreateAt順で取り出したい場合は以下のコードの感じでプロパティを用意します。

    @FetchRequest(entity: Entity.entity(), sortDescriptors: [NSSortDescriptor(keyPath: \Entity.createAt, ascending: true)], animation: nil)
    var ascendingEntities: FetchedResults<Entity>

ソースコード例

import SwiftUI
import CoreData

struct ContentView: View {
    @Environment(\.managedObjectContext) var context: NSManagedObjectContext

    @FetchRequest(entity: Entity.entity(), sortDescriptors: [NSSortDescriptor(keyPath: \Entity.createAt, ascending: true)], animation: nil)
    var ascendingEntities: FetchedResults<Entity>

    var body: some View {
        NavigationView {
            List(ascendingEntities, id: \.self) { entity in
                Text(entity.createAt!.description)
            }.navigationBarTitle("Navigation Bar").navigationBarItems(
                leading: Button(action: {
                    let entity = Entity(entity: Entity.entity(), insertInto: self.context)
                    entity.createAt = Date()
                    try! self.context.save()
                }) {
                    Text("Add")
                },
                trailing: Button(action: {
                    let req:NSFetchRequest<Entity> = Entity.fetchRequest()
                    let result = try! self.context.fetch(req)
                    self.context.delete(result.first!)
                    try! self.context.save()
                }) {
                    Text("Remove")
                }
            )
        }        
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext

        return ContentView().environment(\.managedObjectContext, context)
    }
}

こんな感じでSwiftUIを準備すると、
簡単にCoreDataとの連携が取れます。

Nov-06-2019 07-59-55.gif

つかおう!CoreData!

23
32
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
23
32