2

選択したアイテムのリストを CoreData テーブルから削除したい: 特定の人物の数namesToDelete:

NSError*        error        = nil;
NSFetchRequest* request      = [[NSFetchRequest alloc] init];
[request setEntity:[NSEntityDescription entityForName:@"Person"
                               inManagedObjectContext:managedObjectContext]];
NSPredicate*    predicate    = [NSPredicate predicateWithFormat:@"NOT (name IN %@)", namesToDelete];
[request setPredicate:predicate];
NSArray*         deleteArray = [managedObjectContext executeFetchRequest:request error:&error];
if (error == nil)
{
    for (NSManagedObject* object in deleteArray)
    {
        [managedObjectContext deleteObject:object];
    }

    [managedObjectContext save:&error];
    //### Error handling.
}
else
{
    //### Error handling.
}

これは機能しますが、これは CoreData でこれを行う最も簡単で最短の方法ですか?

4

4 に答える 4

6

最適なトリミングについては、次のようなものです。

NSError*        error        = nil;
NSFetchRequest* request      = [NSFetchRequest fetchRequestWithEntityName:@"Person"];
[request setPredicate:[NSPredicate predicateWithFormat:@"NOT (name IN %@)", namesToDelete]];
NSArray*         deleteArray = [managedObjectContext executeFetchRequest:request error:&error];

if (deleteArray != nil)
{
    for (NSManagedObject* object in deleteArray)
    {
        [managedObjectContext deleteObject:object];
    }

    [managedObjectContext save:&error];
    //### Error handling.
}
else
{
    //### Error handling.
}

のエラーではなく、配列が成功基準として返されるかどうかを確認することにも注意してくださいnil。同様に、save:返された を確認する必要がありますBOOL

于 2013-09-03T07:04:18.313 に答える
4

iOS 9 より前ではオブジェクトを 1 つずつ削除していましたが、iOS 9.0 以降では一括で削除できます。

、、 、で使用NSBatchDeleteRequestできます。iOS 9.0+macOS 10.11+tvOS 9.0+watchOS 2.0+

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"NOT (name IN %@)", namesToDelete]];
NSFetchRequest *fetchRequest = [Person fetchRequest];
[fetchRequest setPredicate:predicate];
// Create batch delete request
NSBatchDeleteRequest *deleteReq = [[NSBatchDeleteRequest alloc] initWithFetchRequest:fetchRequest];
deleteReq.resultType = NSBatchDeleteResultTypeCount;
NSError *error = nil;
NSBatchDeleteResult *deletedResult = [appDelegate.persistentContainer.viewContext executeRequest:deleteReq error:&error];
if (error) {
  NSLog(@"Unable to delete the data");
}
else {
  NSLog(@"%@ deleted", deleteReq.result);
}

Swift コード (上記のリンクから)

let fetch = NSFetchRequest<NSFetchRequestResult>(entityName: "Employee")
fetch.predicate = NSPredicate(format: "terminationDate < %@", NSDate())
let request = NSBatchDeleteRequest(fetchRequest: fetch)

do {
    let result = try moc.execute(request)
} catch {
    fatalError("Failed to execute request: \(error)")
}

ノート:

以下のコメントを見つけましexecutemoc

管理オブジェクト コンテキストの内容に影響を与えずにストアにリクエストを渡すメソッド。

つまり、保存されていないデータはmoc影響を受けません。つまり、削除リクエスト基準に該当するエンティティを作成/更新し、呼び出さsaveれていないmoc場合、そのオブジェクトは削除されません。

于 2017-04-13T09:48:35.413 に答える