我正在开发一个定期从服务器下载数据的应用程序.如果数据需要更新,我会使用类似的内容来更新记录或插入新记录(如果它们不存在).
let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Trip")
for csvTrip in csvTrips {
var trip: NSManagedObject!
let tripId = Int(csvTrip[0])!
fetchRequest.predicate = NSPredicate(format: "id = %d", tripId)
if (context.count(for: fetch) == 0) {
trip = NSEntityDescription.insertNewObject(forEntityName: "Trip", into: context)
trip.setValue(tripId, forKey: "id")
} else {
tripObject = (context.fetch(fetch) as! [NSManagedObject])[0]
}
// Set other properties
}
Run Code Online (Sandbox Code Playgroud)
检查实体是否已存在于每个循环中使得它比仅插入它们大约慢100倍而不进行检查,这对于超过几千个实体来说变成了一个大问题.我已经尝试首先获取所有实体,但我仍然必须循环遍历每个实体并将id添加到数组或其他东西,这不是更快.我知道核心数据与MySQL不同,但我很难相信没有类似INSERT ...... ON DUPLICATE KEY UPDATE的功能,这在MYSQL中非常快.我错过了什么吗?