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

问题描述 投票:2回答:4

我想从Core Data表中删除一个选定的项目列表:一些具有某些qazxsw poi的人员:

namesToDelete

这有效,但这是在CoreData中执行此操作的最简单/最短的方法吗?

ios objective-c core-data
4个回答
3
投票

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

你可以在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. } NSBatchDeleteRequestiOS 9.0+macOS 10.11+上使用tvOS 9.0+

watchOS 2.0+

Swift代码(来自上面的链接)

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);
}

NOTE:

我在下面发表了关于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)") } execute的评论

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

这意味着moc中任何未保存的数据都不会受到影响。即如果您已创建/更新了属于删除请求条件且未在moc上调用save的实体,则该对象将不会被删除。


6
投票

关于最好的修剪是这样的:

moc

另请注意,您检查数组是否作为成功标准返回,而不是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:


1
投票

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


0
投票

这就是我在Swift中使用的方式。

BOOL

只需更改表名和谓词条件即可。请享用!!!

© www.soinside.com 2019 - 2024. All rights reserved.