Ошибка домена = NSCocoaErrorDomain Code = 1570 при удалении значения из Core Data Swift - PullRequest
0 голосов
/ 27 июня 2019

Я получил

Ошибка домена = NSCocoaErrorDomain Code = 1570 "Операция не может быть завершена. (Ошибка какао 1570.)" "

ошибка двух функцийэто раньше работало.

Первая deleteOrder() - это функция, которая вызывается наблюдателем Firebase.Чтобы решить проблему автономного устройства, я изменил логику для удаленных записей с простого удаления их, чтобы также записать их в выделенный узел "Deleted Orders", и после того, как я изменил наблюдателя с .childRemoved на "Orders" узле на childAdded наУзел "Deleted Orders" Я заявил, что получаю эту ошибку.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)")
            }
        })
    }

deleteOrder ():

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")
        }
    }

incrementInventory ():

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)")
        }
    } 

и правильно работающие decmentInventory ():

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)")
        }
    }

1 Ответ

0 голосов
/ 27 июня 2019

После многих попыток я наконец-то нашел, где была проблема.Я изменил Observer. Я также изменил правило удаления CoreData для дочерних сущностей сущности Order с «cascade» на «nullify».Я установил его обратно в «каскад», и теперь все снова работает.Я мог бы сузить это только потому, что функции сохранения работали нормально, но удаление функций вызывало ошибку.Я должен исследовать правильное использование «обнулить» и почему это сломало мой код.Если у вас есть идеи по этому поводу, я буду очень признателен.
Спасибо за помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...