Я пытаюсь понять, как удалить экземпляр основного объекта данных, вызвав метод в моей ViewModel. Мне удалось получить идентификатор экземпляра моего метода, возможно, я просто борюсь с синтаксисом. Я использую Xcode 12.3 iOS 14.3, SwiftUI 2.0 больше нет SceneDelegate или AppDelegate
Вот как выглядит моя модель просмотра:
import SwiftUI
import CoreData
class ViewModel : ObservableObject{
@Environment(\.managedObjectContext) private var viewContext
@FetchRequest(entity: Counter.entity(), sortDescriptors: [
NSSortDescriptor(
keyPath: \Counter.id,
ascending: true),
NSSortDescriptor(
keyPath:\Counter.windowType,
ascending: true )
]) var counters: FetchedResults<Counter>
//.....
Ниже показано, что я пробовал и получил эту ошибку.
+ entityForName: nil не является допустимым NSPersistentStoreCoordinator для поиска имени объекта 'Counter'
После выполнения кода в отладчике это то, что я получаю, когда распечатываю CounterRequested.
‹NSFetchRequest: 0x282d70380› (entity: Counter; предикат: (id == C4BE9AFF-8A8E-4413-AFA3-AC90850C482E); sortDescriptors: ((null)); type: NSManagedObjectResultType;)
идентификаторы действительно совпадают
Затем он вылетает в первой строке в блоке do
func deleteCounter(id: UUID) {
let counterRequested: NSFetchRequest<Counter> = Counter.fetchRequest()
counterRequested.predicate = NSPredicate(format: "id=%@", id.uuidString)
do {
let savedCounters = try self.viewContext.fetch(counterRequested)
for counter in savedCounters {
self.viewContext.delete(counter)
}
try self.viewContext.save()
} catch {
print(error)
}
}
}
Вот откуда я получил свой идентификатор. Могу я пройти здесь весь счетчик? Не знаете, на какой тип ссылаться в моем счетчике?
List {
ForEach(counters, id: \.self){counter in
CounterCell(id: counter.id!, windowType: counter.windowType!, location: counter.location!, pickedImg: counter.pickedImg!, price: counter.price!, qty: counter.qty!, subtotal: counter.subtotal!) .listRowInsets(.init(top: 0,
leading: 0,
bottom: 20,
trailing: 0))
}
Вот мой взгляд, где я хочу вызвать метод удаления
struct CounterCell: View {
@Environment(\.colorScheme) var colorScheme
@State private var stepperValue = 0
@StateObject var estimatorData = EstimatorViewModel()
var id: UUID = UUID()
var windowType: String = "Window Type"
var location: String = "Location"
var pickedImg: String = "defaultImg"
var price: String = "0.0"
var qty: String = "0"
var subtotal: String = "0.00"
var body: some View {
//.....
}
Вот пример, который я нашел:
import Foundation
import UIKit
import CoreData
class DataManager {
static let shared = DataManager(moc: NSManagedObjectContext.current)
var managedContext: NSManagedObjectContext
private init(moc: NSManagedObjectContext) {
self.managedContext = moc
}
// Delete method
// remove birthday
func removeBirthday(id: UUID) {
let fetchRequest: NSFetchRequest<Birthday> = Birthday.fetchRequest()
fetchRequest.predicate = NSPredicate.init(format: "id=%@", id.uuidString)
do {
let bdays = try self.managedContext.fetch(fetchRequest)
for bday in bdays {
self.managedContext.delete(bday)
}
try self.managedContext.save()
} catch {
print(error)
}
}
}
extension NSManagedObjectContext {
static var current: NSManagedObjectContext {
let appDelegate = UIApplication.shared.delegate as! AppDelegate
return appDelegate.persistentContainer.viewContext
}
}