【发布时间】:2020-06-29 05:35:28
【问题描述】:
我正在尝试使用 SwiftUI 在我的应用中实现 CoreData。
我创建了具有两个属性 icaoAPT 和 iataAPT 的实体 Aeroporti
我的应用从 Firebase 数据库下载一些数据并将数据保存在本地以供离线使用。
我设法将所有数据保存在实体 Aeroporti 中,但现在我想创建一个函数来删除所有存储的数据,然后用户再次下载更新的数据。
我设法使用 func cancella() 直接在 contentView 中删除单个索引处的数据。
但现在我在 DataManager 中遇到了 func delate all 的问题。
import SwiftUI
import CoreData
struct ContentView: View {
@ObservedObject var dm : DataManager
@Environment(\.managedObjectContext) var managedObjectContext
@FetchRequest(entity: Aeroporti.entity(),
sortDescriptors: [NSSortDescriptor(keyPath: \Aeroporti.iataAPT, ascending: true)]) var aeroport : FetchedResults<Aeroporti> // crea la variabile che contiene le ricette
var body: some View {
VStack{
HStack{
Button(action: {
DataManager.shared.downloadData(dbCore: self.managedObjectContext)
}) {
Text("save from manager")
}
Spacer()
Button(action: {
DataManager.shared.delateALL(dbCore: self.managedObjectContext)
}) {
Text("del all")
}
}
List{
ForEach(aeroport, id: \.self) { apt in
VStack{
Text(apt.iataAPT ?? "sconosciuto")
Text(apt.icaoAPT ?? "sconosciuto")
}
}
.onDelete(perform: cancella)
}
}
}
// this delate at single index
func cancella(at offset : IndexSet) { //1 ricevo indice ricetta , indexset è un array di indici
for index in offset { // 2 ciclo dentro l'array offset con dentro gli indici
let apt = aeroport[index] // 3 tiro furoi la ricetta a quel indice
managedObjectContext.delete(apt) // 7 cancella alla fine la ricetta
}
do { // 8 salvo
try self.managedObjectContext.save()
} catch {
debugPrint(error.localizedDescription)
}
}
}
我想删除实体 Aeroporti 中的所有记录,我试图写这个,但我当然卡住了:
class DataManager: ObservableObject {
let objectWillChange = PassthroughSubject<Void, Never>()
let db = Firestore.firestore()
static let shared = DataManager()
// get data from Firestore and Save locally
func downloadData(dbCore: NSManagedObjectContext ) {
db.collection("VHHH").document("VHHHid").getDocument { (document, error) in
if error == nil {
if document != nil && document!.exists {
let data = document!.data()
let icaoAPT = data?["icaoAPT"] ?? "empty"
let iataAPT = data?["iataAPT"] ?? "empty"
let aeroporto = Aeroporti(context: dbCore)
aeroporto.icaoAPT = icaoAPT as? String
aeroporto.iataAPT = iataAPT as? String
debugPrint(aeroporto.iataAPT!)
do {
try dbCore.save()
print("Saved Data")
} catch {
let nserror = error as NSError
fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
}
}
}
}
}
// test delate all...NOT WORKING
func delateALL(dbCore: NSManagedObjectContext, vett: FetchedResults<NSFetchRequestResult>){
// let req = NSFetchRequest<NSFetchRequestResult>(entityName: "Aeroporti")
// 3 tiro furoi la ricetta a quel indice
for data in vett {
let data1 = vett[0]
// dbCore.delete(data1)
}
}
// delate all but not update
// func delateALL2(dbCore: NSManagedObjectContext){
// let fetchRequest: NSFetchRequest<NSFetchRequestResult> = NSFetchRequest(entityName: "Aeroporti")
// let deleteRequest = NSBatchDeleteRequest(fetchRequest: fetchRequest)
//
//
// do {
// try dbCore.execute(deleteRequest)
// debugPrint("canx all")
//
// do {
// try dbCore.save()
// print("Saved Data")
// } catch {
//
// let nserror = error as NSError
// fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
// }
//
// } catch let error as NSError {
// debugPrint(error)
// }
//
// }
}
谢谢你的帮助
【问题讨论】:
标签: swift xcode core-data save swiftui