核心数据:DELETE WHERE

pis*_*hio 19 core-data objective-c ios

我知道如何使用NSPredicate来执行类似SQL SELECT的操作.我该如何表现DELETE WHERE?我是否必须[NSManagedObjectContext deleteObject]为每个获取的对象调用?谢谢

NSError *error;

NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:[NSEntityDescription entityForName:TASK_ENTITY inManagedObjectContext:managedObjectContext]];

NSPredicate *predicate = [NSPredicate predicateWithFormat: @"label LIKE  %@", label];
[request setPredicate:predicate];

NSArray *array = [managedObjectContext executeFetchRequest:request error:&error];

[managedObjectContext deleteObject:[array objectAtIndex:0]];
Run Code Online (Sandbox Code Playgroud)

Ale*_*aud 6

我相信循环返回的数组并调用[NSManagedObjectContext deleteObject:]是"正确"/惯用的方法.它可能看起来效率低下,但请记住,fetch命令实际上并没有获取对象的数据,并且该deleteObject:方法只是标记要删除的对象,这在发送时会应用[NSManagedObjectContext save:].不知道核心数据的内部我不能告诉你它是否像DELETE WHERE查询一样高效(可能是Core Data在fetch的内存中有索引的主键,并使用它们)但是根据我对Core Data应用程序进行分析的经验,它不是比保存新的或更新的对象慢得多.


Vin*_*ier 0

除了使用NSArray方法进行删除之外,我还没有找到其他方法。
(如果有,我想知道)
如果您确实不想存储数组,则可以将调用嵌套在一行上。但如果您这样做,请验证发生错误时 Fetch 的返回值是什么。

makeObjectsPerformSelector :
向数组中的每个对象发送由给定选择器标识的消息,从第一个对象开始,一直到数组中的最后一个对象。
- (void)makeObjectsPerformSelector:(SEL)aSelector

或者有一个块应该会更快。