我有实体,想通过批量请求一次删除 10 条记录。实体可能有任意数量的记录。我使用 fetchLimit = 10 和偏移量 0,10,20,30 创建了获取请求...当我尝试删除时,并非所有记录都被删除。它只是删除随机记录。但是日志显示成功删除了记录。我们如何解决这个问题。
public static func deleteEvents() {
let coredataManager = CoreDataManager()
let persistence = PersistenceManager(coredataManager: coredataManager)
let eventCount = coredataManager.countOfObjects(Event.entityName, predicate: nil)
let iterations = getNumberOfEventCallIterations(eventCount)
print("iterations.... \(iterations)")
var fetchRequests: [NSFetchRequest<NSFetchRequestResult>] = []
(1...iterations).enumerated().forEach { index in
let fetchReq = coredataManager.fetchRequest(Event.entityName,
context: coredataManager.backgroundObjectContext!,
predicate: nil,
sortedBy: "trackedAt",
ascending: false)
fetchReq.fetchLimit = 10
fetchReq.fetchOffset = index.offset * 10
fetchRequests.append(fetchReq)
persistence.deleteEvents(fetchRequest: fetchReq, context: coredataManager.backgroundObjectContext!) { _ in
logger.debug(withMessage: "Deleting all events")
// semaphore.signal()
}
}
}
func batchDelete(_ request: NSFetchRequest<NSFetchRequestResult>,
_ context: NSManagedObjectContext,
completion: CoreDataOperationHandler? = nil) {
let batchDeleteRequest = NSBatchDeleteRequest(fetchRequest: request)
batchDeleteRequest.resultType = .resultTypeObjectIDs
do {
guard let result = try context.execute(batchDeleteRequest) as? NSBatchDeleteResult else {
completion?(.failure(.deleteFailed(error: NSError(domain: "No Result from batch request", code: 1, userInfo: nil))))
return
}
guard let resultObject = result.result as? [NSManagedObjectID] else {
completion?(.failure(.deleteFailed(error: NSError(domain: "Result object type cast to NSManagedObjectID failed", code: 2, userInfo: nil))))
return
}
let changes: [AnyHashable: Any] = [
NSDeletedObjectsKey: resultObject
]
NSManagedObjectContext.mergeChanges(fromRemoteContextSave: changes, into: [context])
completion?(.success(()))
} catch {
completion?(.failure(.deleteFailed(error: error as NSError)))
GaugeSDK.trackEvent(name: TelemetryEvents.telemetryError.rawValue, type: .error, attributes: [.name: "error in batch deletion",
.description: error.localizedDescription])
logger.error(withMessage: "error in batch delete \(error.localizedDescription)", category: .coredata)
}
}