1. ホーム
  2. ios

[解決済み] コア・データ エンティティの全インスタンスを削除する最短の方法

2022-03-24 19:19:48

質問

Core Dataを使用して、Webサービス呼び出しの結果をローカルに持続させています。Webサービスは、例えば、"Cars"の完全なオブジェクトモデルを返します - 約2000台です(そして、私はWebサービスが1台またはすべての車より小さいものを返すようにできません。

次にアプリケーションを開いたとき、Core Dataの永続化されたコピーを更新するために、すべてのCarsのWebサービスを再度呼び出したいのですが、重複を防ぐために、最初にローカルキャッシュのすべてのデータをパージする必要があります。

管理オブジェクトコンテキスト内の特定のエンティティのすべてのインスタンス(例:タイプ "CAR"のすべてのエンティティ)をパージする素早い方法はありますか?または、それらを呼び出し、その結果を反復してそれぞれ削除し、その後保存する必要がありますか?

理想的には、entityがBlahであるところをすべて削除すると言えばいいのでしょう。

どのように解決するのですか?

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];

一括削除に関する詳しい情報は WWDC2015のセッション「"What's New in 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