从 Core Data Swift 中删除值时,错误域 = NSCocoaErrorDomain Code=1570



>我得到了

错误域=

NSCocoa错误域代码=1570"操作不可能 完成。(可可错误 1570。

曾经工作的两个函数出错。

第一个deleteOrder()是由Firebase观察者调用的函数。为了解决离线设备问题,我将删除条目的逻辑从简单地删除它们更改为在专用"Deleted Orders"节点中操纵它们,并且在我将观察器从节点上的"Orders".childRemoved更改为"Deleted Orders"节点上的childAdded后,我说收到此错误。deleteOrder()没有改变,但现在CoreData保存时抛出错误。据我所知并发现,(Cocoa error 1570.)是关于在保存到CoreData时缺少一些非可选参数,就像我之前使用saveOrder()函数所经历的那样,但在从CoreData中删除时我无法解释它。

我也只从两个功能中的一个收到相同的错误,这两个功能在接收订单或订单取消时保持库存更新。decrementInventory()在收到新订单时运行良好,但在收到订单取消时incrementInventory()抛出(Cocoa error 1570.)。你能帮我找出错误在哪里吗?我一直在研究decrementInventory()incrementInventory()之间的代码差异,但他们正在以相反的方式做事情。

一如既往地无限感谢您的时间和帮助。

这些功能是:

Firebase 观察者:

static func getDeletedOrders(completed: @escaping (Bool) -> ()) {
print("getDeletedOrders() : started")
let ref = Database.database().reference()
// Deleted Orders
// Using .childAdded on new Deleted Orders node
ref.child("Continent").child("Europe").child("Country").child(UserDetails.country!).child("Region").child(UserDetails.region!).child("City").child(UserDetails.city!).child("Shops").child(UserDetails.fullName!).child("Deleted Orders").observe(.childAdded, with: { (snapshot) in
print("snapshot is: (snapshot)")
guard let value = snapshot.value as? [String : String] else {return}
let orderId = value["Order Id"]!
let customerName = value["User Name"]!
let customerFcmToken = value["User fcmToken"]!
let itemsIdList = value["Items Id List"]!
do {
try Order.deleteOrder(completed: { (true) in
if #available(iOS 10.0, *) {
// Local Notification
let actions: [UNNotificationAction] = [UNNotificationAction(identifier: "chiudi", title: "Chiudi", options: [.foreground])]
LocalNotifications.newTimeIntervalNotification(notificationType: "Deleted order", actions: actions, categoyIdentifier: "Deleted order", title: "Ordine", body: "Un ordine è stato cancellato", userInfo: [:], timeInterval: 0.1, repeats: false)
} else  if #available(iOS 9.0, *){
// Local Notification
LocalNotifications.newTimeIntervalNotification(notificationType: "Deleted order", actions: [], categoyIdentifier: "Deleted order", title: "Ordine", body: "Un ordine è stato cancellato", userInfo: [:], timeInterval: 0.1, repeats: false)
}
//                    // send push to customer
//                    PushNotifications.sendPushNotification(to: customerFcmToken, title: "Order number: (String(describing: orderId))", subtitle: " Shop: (String(describing: UserDetails.fullName!))", body: "Thank you (customerName) we received your order cancellation. We'll be happy to see you next time you shop with us again. Bye.")
// localized push
PushNotifications.sendPushNotification(to: customerFcmToken, title: String(format: NSLocalizedString( "ORDER_DELETED_PUSH_TITLE", comment: ""), orderId), subtitle: String(format: NSLocalizedString( "ORDER_DELETED_PUSH_SUBTITLE", comment: ""), UserDetails.fullName!), body: String(format: NSLocalizedString("ORDER_DELETED_PUSH_BODY", comment: "") , customerName))
} ,orderId: orderId, itemsIdList: itemsIdList)
print("getDeletedOrders() : ended, now observing")
completed(true)
} catch {
print("getDeletedOrders() : Error in saving snapshot to Core Data : (error)")
}
})
}

删除顺序() :

static func deleteOrder(completed: @escaping(Bool) -> (), orderId: String, itemsIdList: String) throws {
let context = CoreData.databaseContext
let request: NSFetchRequest<Order> = Order.fetchRequest()
request.sortDescriptors = [NSSortDescriptor( key: "orderId", ascending: true)]
request.predicate = NSPredicate(format: "orderId == %@", orderId)
do {
let fetch = try context.fetch(request)
if fetch.count > 0 {
for value in fetch {
do {
print("Order.deleteOrder() : fetch.count is: (fetch.count)")
print("Order.deleteOrder() : found order is: (value)")
context.delete(value)
print("Order.deleteOrder() : Order deleted")
var productIdListArray:[String] = value.itemsIdList!.components(separatedBy: ",")
for product in 0..<productIdListArray.count {
do {
try Product.incrementIventory(completed: { (true) in
print("Order.deleteOrder() : Inventory seccessfully updated after order cancellation")

}, productId: productIdListArray[product])
} catch {
print("Error in incrementing inventory : (error)")
}
}
}
do {
try context.save()
print("Order.deleteOrder() : Order deletion is saved")
completed(true)
} catch  {
print("Order.deleteOrder() : Error saving Order deletion: (error)")
}
}
}
} catch  {
print("Order.deleteOrder() : Erron: Order not found")
}
}

增量库存():

static func incrementIventory(completed: @escaping (Bool) -> (), productId: String) throws {
print("Product.incrementIventory() : started")
let context = CoreData.databaseContext
let request: NSFetchRequest<Product> = Product.fetchRequest()
request.predicate = NSPredicate(format: "productId == %@", productId)
do {
let fetch = try context.fetch(request)
print("Product.incrementIventory(): fetching product")
if fetch.count > 0 {
for value in fetch {
//                if value.productId == productId {
if #available(iOS 10.0, *) {
let newAvailableQuantity = Int(value.availableQuantity!)! + 1
let newSoldQuantity = Int(value.soldQuantity!)! - 1
value.setValue(String(describing: newAvailableQuantity) , forKey: "availableQuantity")
value.setValue(String(describing: newSoldQuantity), forKey: "soldQuantity")
let ref = Database.database().reference()
ref.child("Continent").child("Europe").child("Country").child("(UserDetails.country!)").child("Region").child(UserDetails.region!).child("City").child(UserDetails.city!).child("Catalog").child("(productId)").child("Available Quantity").setValue(String(describing: newAvailableQuantity))
ref.child("Continent").child("Europe").child("Country").child("(UserDetails.country!)").child("Region").child(UserDetails.region!).child("City").child(UserDetails.city!).child("Catalog").child("(productId)").child("Sold Quantity").setValue(String(describing: newSoldQuantity))
} else {
// Fallback on earlier versions
let newAvailableQuantity = Int(value.availableQuantity!)! + 1
let newSoldQuantity = Int(value.soldQuantity!)! - 1
value.setValue(String(describing: newAvailableQuantity) , forKey: "availableQuantity")
value.setValue(String(describing: newSoldQuantity), forKey: "soldQuantity")
let ref = Database.database().reference()
ref.child("Continent").child("Europe").child("Country").child("(UserDetails.country!)").child("Region").child(UserDetails.region!).child("City").child(UserDetails.city!).child("Catalog").child("(productId)").child("Available Quantity").setValue(String(describing: newAvailableQuantity))
ref.child("Continent").child("Europe").child("Country").child("(UserDetails.country!)").child("Region").child(UserDetails.region!).child("City").child(UserDetails.city!).child("Catalog").child("(productId)").child("Sold Quantity").setValue(String(describing: newSoldQuantity))
}
//                }
}
}
} catch  {
print("Product.incrementIventory(): Error in fetching a product : (error)")
}
do {
try context.save()
print("Product.incrementIventory(): modified product is saved to Core Data")
completed(true)
} catch  {
print("Product.incrementIventory(): Error saving modified product to Core Data : (error)")
}
} 

和正常工作的递减库存():

static func decrementIventory(completed: @escaping (Bool) -> (), productId: String) throws {
print("Product.decrementIventory() : started")
let context = CoreData.databaseContext
let request: NSFetchRequest<Product> = Product.fetchRequest()
request.predicate = NSPredicate(format: "productId == %@", productId)
do {
let fetch = try context.fetch(request)
print("Product.decrementIventory() : fetching product")
if fetch.count > 0 {
for value in fetch {
//                if value.productId == productId {
if #available(iOS 10.0, *) {
let newAvailableQuantity = Int(value.availableQuantity!)! - 1
let newSoldQuantity = Int(value.soldQuantity!)! + 1
value.setValue(String(describing: newAvailableQuantity) , forKey: "availableQuantity")
value.setValue(String(describing: newSoldQuantity), forKey: "soldQuantity")
let ref = Database.database().reference()
ref.child("Continent").child("Europe").child("Country").child("(UserDetails.country!)").child("Region").child(UserDetails.region!).child("City").child(UserDetails.city!).child("Catalog").child("(productId)").child("Available Quantity").setValue(String(describing: newAvailableQuantity))
ref.child("Continent").child("Europe").child("Country").child("(UserDetails.country!)").child("Region").child(UserDetails.region!).child("City").child(UserDetails.city!).child("Catalog").child("(productId)").child("Sold Quantity").setValue(String(describing: newSoldQuantity))
} else {
// Fallback on earlier versions
let newAvailableQuantity = Int(value.availableQuantity!)! - 1
let newSoldQuantity = Int(value.soldQuantity!)! + 1
value.setValue(String(describing: newAvailableQuantity) , forKey: "availableQuantity")
value.setValue(String(describing: newSoldQuantity), forKey: "soldQuantity")
let ref = Database.database().reference()
ref.child("Continent").child("Europe").child("Country").child("(UserDetails.country!)").child("Region").child(UserDetails.region!).child("City").child(UserDetails.city!).child("Catalog").child("(productId)").child("Available Quantity").setValue(String(describing: newAvailableQuantity))
ref.child("Continent").child("Europe").child("Country").child("(UserDetails.country!)").child("Region").child(UserDetails.region!).child("City").child(UserDetails.city!).child("Catalog").child("(productId)").child("Sold Quantity").setValue(String(describing: newSoldQuantity))
}
//                }
}
}
} catch  {
print("Product.decrementIventory() : Error in fetching a product : (error)")
}
do {
try context.save()
print("Product.decrementIventory() : modified product is saved to Core Data")
// setting completion for decrementIventory() here causes inconsistency in Firebase, so we set completion for decrementIventory() in Firebase.uploadProduct completed scope
completed(true)
} catch  {
print("Product.decrementIventory() : Error saving modified product to Core Data : (error)")
}
}

经过多次尝试,我终于找到了问题所在。我更改了观察者 I 还将订单实体的子实体的 CoreData 删除规则从"级联"更改为"无效"。我已将其设置回"级联",现在一切恢复正常。我可以将其缩小到它,只是因为保存功能正常工作但删除功能导致错误。 我将不得不调查"nullify"的正确用法以及为什么它破坏了我的代码。 如果你对此有任何想法,我将不胜感激。
谢谢你帮助我。

最新更新