私は定期的にサーバからデータをダウンロードするアプリを開発しています。データを更新する必要がある場合は、次のようなものを使用してレコードを更新するか、存在しない場合は新しいレコードを挿入します。エンティティは、すでに各ループに存在するかどうかの確認コアデータを使用してレコードを挿入/更新する最も効率的な方法は?
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
}
はちょうど千以上のいくつかの企業との大きな問題となっており、確認せずにそれらを挿入するよりも、それは約100倍遅くなります。私は最初にすべてのエンティティをフェッチしようとしましたが、まだそれぞれをループしてidを配列などに追加する必要がありますが、あまり高速ではありません。私はコアデータがMySQLと同じではないことを知っていますが、INSERT ...と同様の機能はないと信じるのは難しいです.DUPLICATE KEY UPDATEは非常に高速です。何か不足していますか?
すべてのIDを取得し、それらを 'Set'にロードするのはかなり速いはずです – Paulw11
IDを取得する方法はありますか?私が知っている唯一の方法は、すべてのオブジェクトをフェッチし、それらをループしてセットに追加することです。 –
fetch要求の 'propertiesToFetch'プロパティを設定すると、' id'だけを返すことができます。また、結果の型を 'dictionaryResultType'に設定します。現在のオブジェクトをすべて取得し、 'map'操作を使ってIDを素早くセットにロードすることができます – Paulw11