我知道如何使用NSPredicate来执行SQL SELECT
-like操作。我怎样才能执行像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]];
发布于 2011-12-12 13:25:48
我相信循环遍历返回的数组并调用[NSManagedObjectContext deleteObject:]
是“正确的”/idiomatic方法。这看起来似乎很低效,但请记住,fetch命令实际上并不获取对象的数据,而deleteObject:
方法只是将对象标记为删除,在发送[NSManagedObjectContext save:]
时会应用该方法。由于不知道核心数据的内部结构,我不能告诉你它是否像DELETE WHERE
查询一样高效(大概核心数据在内存中有来自fetch的索引主键,并使用这些主键),但根据我分析核心数据应用程序的经验,它并不比保存新的或更新的对象慢很多。
发布于 2015-03-30 19:00:31
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]);
}
发布于 2016-04-28 17:46:06
我刚刚尝试了一下,它是成功的:
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];
}
https://stackoverflow.com/questions/8158423
复制相似问题