私は Core Data を使用して、Web サービス呼び出しからの結果をローカルに保持しています。Web サービスは、たとえば「車」の完全なオブジェクト モデルを返します。その数は約 2000 台になる可能性があります (Web サービスが 1 台未満またはすべての車を返すようにすることはできません)。
次にアプリケーションを開いたときに、すべての車の Web サービスを再度呼び出して Core Data の永続コピーを更新したいのですが、重複を防ぐために、まずローカル キャッシュ内のすべてのデータを消去する必要があります。
管理対象オブジェクト コンテキスト内の特定のエンティティのすべてのインスタンス (たとえば、タイプ「CAR」のすべてのエンティティ) を消去するより簡単な方法はありますか。それとも、それらを呼び出してクエリし、結果を反復処理してそれぞれを削除してから保存する必要がありますか。
理想的には、エンティティが Blah であるものをすべて削除するように指示できます。
ベストアンサー1
iOS 9以降:
iOS 9 では、述語に一致するオブジェクトをすべてメモリにロードせずに簡単に削除できる という新しいクラスが追加されましたNSBatchDeleteRequest
。使用方法は次のとおりです。
スイフト5
let fetchRequest: NSFetchRequest<NSFetchRequestResult> = NSFetchRequest(entityName: "Car")
let deleteRequest = NSBatchDeleteRequest(fetchRequest: fetchRequest)
do {
try myPersistentStoreCoordinator.execute(deleteRequest, with: myContext)
} catch let error as NSError {
// TODO: handle the error
}
オブジェクティブC
NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"Car"];
NSBatchDeleteRequest *delete = [[NSBatchDeleteRequest alloc] initWithFetchRequest:request];
NSError *deleteError = nil;
[myPersistentStoreCoordinator executeRequest:delete withContext:myContext error:&deleteError];
一括削除の詳細については、WWDC 2015 の「Core Data の新機能」セッション(14:10頃から始まります)
iOS 8以前:
すべてを取得してすべて削除します:
NSFetchRequest *allCars = [[NSFetchRequest alloc] init];
[allCars setEntity:[NSEntityDescription entityForName:@"Car" inManagedObjectContext:myContext]];
[allCars setIncludesPropertyValues:NO]; //only fetch the managedObjectID
NSError *error = nil;
NSArray *cars = [myContext executeFetchRequest:allCars error:&error];
[allCars release];
//error handling goes here
for (NSManagedObject *car in cars) {
[myContext deleteObject:car];
}
NSError *saveError = nil;
[myContext save:&saveError];
//more error handling here