Предикат ищет идентификатор, который не существует? - PullRequest
0 голосов
/ 23 апреля 2019

У меня есть метод, подобный так:

func syncSectors(sectors: [SectorsModel]){

    BackgroundContext.performAndWait {
        //Fetch results from the database
        let matchingSectorRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Sectors")
        //Delete Sector ids
        let deleteSectorIds = sectors.map { $0.ID }.compactMap { $0 }

        matchingSectorRequest.predicate = NSPredicate(format: " !(ANY sector_id IN %@) AND (sector_id != nil)", argumentArray: [deleteSectorIds])


        let batchDeleteRequest = NSBatchDeleteRequest.init(fetchRequest: matchingSectorRequest)
        batchDeleteRequest.resultType = .resultTypeObjectIDs

        // Execute the request to do batch delete and merge the changes to viewContext, which triggers the UI update
        do {
            let batchDeleteResult: NSBatchDeleteResult = try BackgroundContext.execute(batchDeleteRequest) as! NSBatchDeleteResult

            if let deletedObjectIDs = batchDeleteResult.result as? [NSManagedObjectID] {
                NSManagedObjectContext.mergeChanges(fromRemoteContextSave: [NSDeletedObjectsKey: deletedObjectIDs], into: [Context])
            }

        } catch {
            print("Error: \(error)\nCould not batch delete existing records.")
            return
        }
        //******************** End of Delete Sectors *****************************

        // Insert new SubSectors
        for sector in sectors where !sector.exists {
            _ =  saveSectors(sectors: sectors)
        }

        do {
            // Save all changes on background context
            try BackgroundContext.save()

            Context.performAndWait {
                do {
                    // Saves the data from the background to the main context
                    try Context.save()
                } catch {
                    print("Failure to save context: \(error)")
                }
            }
        } catch {
            print("Error: \(error)\nCould not save new records.")

            BackgroundContext.rollback()

            return
        }

        //******************** End of Insert new Sectors *****************************

        //Update Sectors
        for sector in sectors where !sector.ID.isNilOrEmpty{

            let batchUpdateRequest = NSBatchUpdateRequest.init(entityName: "Sectors")
            batchUpdateRequest.resultType = .updatedObjectIDsResultType
            batchUpdateRequest.predicate = NSPredicate.init(format: "sector_id == %@", sector.ID)

            //Perform the inital update
            batchUpdateRequest.propertiesToUpdate = ["sector_id" :sector.ID, "SECTOR_NAME" : sector.SECTOR_NAME]

            // Execute the request to do batch update and merge the changes to viewContext, which triggers the UI update
            do {
                let batchUpdateResult: NSBatchUpdateResult = try BackgroundContext.execute(batchUpdateRequest) as! NSBatchUpdateResult

                if let UpdatedObjectIDs = batchUpdateResult.result as? [NSManagedObjectID] {
                    NSManagedObjectContext.mergeChanges(fromRemoteContextSave: [NSUpdatedObjectsKey: UpdatedObjectIDs],
                                                        into: [Context])
                }
            } catch {
                print("Error: \(error)\nCould not batch update existing records.")
                return
            }
            //******************** End of Update Sectors *****************************


        }
    }

}

Мое приложение падает, когда я достигаю этой точки:

, если пусть selectedObjectIDs = batchDeleteResult.result as?[NSManagedObjectID] {NSManagedObjectContext.mergeChanges (fromRemoteContextSave: [NSDeletedObjectsKey: disabledObjectIDs], в: [Context])}

следующие идентификаторы, которые у меня есть в моем массиве, следующие:deleteSectorIds: elements 24 элемента - 0: «8» - 1: «9» - 2: «11» - 3: «12» - 4: «13» - 5: «14» - 6: «15» - 7:«16» - 8: «17» - 9: «18» - 10: «19» - 11: «20» - 12: «21» - 13: «22» - 14: «23» - 15: «24"- 16:" 25 "- 17:" 27 "- 18:" 28 "- 19:" 29 "- 20:" 30 "- 21:" 31 "- 22:" 32 "- 23:" 33 "

И я не могу понять, почему я получаю эту ошибку:

Завершение приложения из-за необработанного исключения «NSInvalidArgumentException», причина: «Идентификатор ключевого пути не найден в сущности»

когда у меня явно нет идентификатора со значением 7 в моем массиве?

Кто-нибудь, кто может разбить его для меня, что на самом деле происходит?

Моя модель выглядит следующим образом:

import Foundation import ObjectMapper

enum SectorsModelEnum: String {

case SECTOR_NAME = "SECTOR_NAME"
case ID = "ID"
case SECTOR = "SECTOR"

}

struct SectorsModel: Mappable {

var SECTOR_NAME: String!
var ID: String!
var SECTOR: [SubSectorsModel]!

init?(map: Map) {

}

init(SECTOR_NAME: String, ID: String, SECTOR: [SubSectorsModel] ) {

    self.SECTOR_NAME = SECTOR_NAME
    self.ID = ID
    self.SECTOR = SECTOR

}

init() {
    self.SECTOR = []
    self.SECTOR_NAME = ""
    self.ID = ""
}

mutating func mapping(map: Map) {

    SECTOR_NAME <- map[SectorsModelEnum.SECTOR_NAME.rawValue]
    ID <- map[SectorsModelEnum.ID.rawValue]
    SECTOR <- map[SectorsModelEnum.SECTOR.rawValue]

}

var exists: Bool {
    let fetchRequest = Sectors.sectorsFetchRequest()
    fetchRequest.predicate = NSPredicate(format: "ID == %@", ID )
    var sectors: [Sectors] = []
    do {
        sectors = try Context.fetch(fetchRequest)
    } catch {
        print("Could not fetch data \(error)")
    }
    return sectors.first != nil ? true : false
}

}

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