Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何使用NSPredicate从CoreData中删除选定数量的行?_Ios_Objective C_Core Data - Fatal编程技术网

Ios 如何使用NSPredicate从CoreData中删除选定数量的行?

Ios 如何使用NSPredicate从CoreData中删除选定数量的行?,ios,objective-c,core-data,Ios,Objective C,Core Data,我想从CoreData表中删除选定的项目列表:具有特定名称的若干人删除: NSError* error = nil; NSFetchRequest* request = [[NSFetchRequest alloc] init]; [request setEntity:[NSEntityDescription entityForName:@"Person" inManagedObjectConte

我想从CoreData表中删除选定的项目列表:具有特定
名称的若干人删除

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中这是最简单/最短的方法吗?

是的,就是这样。没有类似SQL的删除功能。

关于最佳修剪,如下所示:

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
中的错误。同样,对于
保存:
您应该检查返回的
BOOL

在iOS 9之前,我们逐个删除对象,但在iOS 9.0+上,我们可以批量删除它们

您可以在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(entityName:“雇员”)
fetch.predicate=NSPredicate(格式:“terminationDate<%@”,NSDate())
let request=NSBatchDeleteRequest(fetchRequest:fetch)
做{
让结果=尝试moc.execute(请求)
}抓住{
fatalError(“未能执行请求:\(错误)”)
}

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

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


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

这是我在Swift中使用的方法

func deleteRecentWithId(recentID : String)
{
    let fetchRequest: NSFetchRequest<Recent_Message> = Recent_Message.fetchRequest()
    fetchRequest.predicate = NSPredicate(format: "recentUserOrGroupid = %@", recentID)
    let request = NSBatchDeleteRequest(fetchRequest: fetchRequest as! NSFetchRequest<NSFetchRequestResult>)

    do {
        try context.execute(request)
        try context.save()
    } catch {
        print ("There was an error")
    }

}
func deleteRecentWithId(recentID:String)
{
let fetchRequest:NSFetchRequest=Recent_Message.fetchRequest()
fetchRequest.predicate=NSPredicate(格式:“recentUserOrGroupid=%@”,recentID)
let request=NSBatchDeleteRequest(fetchRequest:fetchRequest as!NSFetchRequest)
做{
try context.execute(请求)
尝试context.save()
}抓住{
打印(“出现错误”)
}
}

只需更改表名和谓词条件享受

您可以减少几行,但这就是过程。@Wain请在回答中告诉我如何做,我将奖励您:-)谢谢您的回答。因此,删除我的“非(姓名在%@)”排除列表时,没有要保存的行吗?我不需要使用谓词,只想知道最短的代码。谢谢你,谢谢你这么快的回复!不幸的是,CoreData在一行程序中似乎不太好。如果您打算经常这样做,您可以编写一个实用程序方法,该方法采用实体名称和谓词并返回BOOL。由于iOS 9+现在是标准(对于大多数情况),这应该成为公认的答案。谢谢@为swift用户添加了swift代码:)很高兴知道它对您有帮助!!
func deleteRecentWithId(recentID : String)
{
    let fetchRequest: NSFetchRequest<Recent_Message> = Recent_Message.fetchRequest()
    fetchRequest.predicate = NSPredicate(format: "recentUserOrGroupid = %@", recentID)
    let request = NSBatchDeleteRequest(fetchRequest: fetchRequest as! NSFetchRequest<NSFetchRequestResult>)

    do {
        try context.execute(request)
        try context.save()
    } catch {
        print ("There was an error")
    }

}