データベースのデータをSwiftUIに表示したい場合、
データベースがCoreDataであれば、
@FetchRequest
と FetchedResults
を使うことによって連携することができます。
FetchRequest
FetchRequestのパラメータには sortDescriptors
や predicate
などが用意されていて、
@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との連携が取れます。
つかおう!CoreData!