У меня есть метод, подобный так:
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
}
}