Objective c 核心数据:在何处删除

Objective c 核心数据:在何处删除,objective-c,ios,core-data,Objective C,Ios,Core Data,我知道如何使用NSPredicate执行类似SQLSELECT的操作。如何执行类似于删除WHERE?是否必须为每个获取的对象调用[NSManagedObjectContext deleteObject]?谢谢 NSError *error; NSFetchRequest *request = [[NSFetchRequest alloc] init]; [request setEntity:[NSEntityDescription entityForName:TASK_ENTITY inMan

我知道如何使用NSPredicate执行类似SQL
SELECT
的操作。如何执行类似于
删除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]];

除了使用删除方法,我还没有找到其他方法。
(如果有,我想知道)
如果您真的不想存储数组,可以将调用嵌套在一条线路上。但如果您这样做,请验证在出现错误的情况下获取的返回内容

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


或者有一个块1被认为更快。

我认为在返回的数组上循环并调用
[NSManagedObjectContext deleteObject://code>是“正确的/惯用的方法”。这似乎效率低下,但请记住,fetch命令实际上并没有获取对象的数据,而
deleteObject:
方法只是将对象标记为要删除,当您发送
[NSManagedObjectContext save:
时会应用该方法。由于不了解核心数据的内部结构,我无法告诉您它是否与
删除WHERE
查询一样高效(可能核心数据在内存中具有从fetch得到的索引主键,并使用这些主键)但根据我分析核心数据应用程序的经验,它并不比保存新的或更新的对象慢多少。

我刚刚尝试了这一点,并取得了成功:

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

[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"label LIKE%@", label.text]];

NSError* error = nil;

NSArray* results = [managedObjectContext executeFetchRequest:fetchRequest error:&error];

if(![results count]==0)
{
   [managedObjectContext deleteObject:[results objectAtIndex:0]];
}
if (![managedObjectContext save:&error]) {
    NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]);
}
NSError *error = nil;
NSFetchRequest* fetchrequest = [NSFetchRequest fetchRequestWithEntityName:@"EntityName"];
[request setPredicate:[NSPredicate predicateWithFormat:@"attribute == %@", variable]];
NSArray *deleteArray = [context executeFetchRequest:fetchrequest error:&error];

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

        //Reload/refresh table or whatever view..
    }

    [context save:&error];
}
您可以在iOS 9.0+
macOS 10.11+
tvOS 9.0+
watchOS 2.0+

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"label LIKE  %@", label];
NSFetchRequest *fetchRequest = [TaskEntity fetchRequest];
[fetchRequest setPredicate:predicate];
// Create batch delete request
NSBatchDeleteRequest *deleteReq = [[NSBatchDeleteRequest alloc] initWithFetchRequest:fetchRequest];
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(entityName:“雇员”)
fetch.predicate=NSPredicate(格式:“terminationDate<%@”,NSDate())
let request=NSBatchDeleteRequest(fetchRequest:fetch)
做{
让结果=尝试moc.execute(请求)
}抓住{
fatalError(“未能执行请求:\(错误)”)
}

注: 我在下面找到了关于
moc的
execute
的评论

方法将请求传递到存储,而不影响托管对象上下文的内容


这意味着
moc
中任何未保存的数据都不会受到影响。i、 e.如果您创建/更新了符合删除请求条件的实体,并且没有在
moc
上调用
save
,则该对象不会被删除。

我添加了使用新API(iOS 9.0+)的答案,该API可以批量删除对象:
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)")
}