Iphone 如何搜索核心数据实体并删除某些对象

Iphone 如何搜索核心数据实体并删除某些对象,iphone,objective-c,core-data,ios,nspredicate,Iphone,Objective C,Core Data,Ios,Nspredicate,我不清楚如何从核心数据数据库中删除某些对象。我想我已经可以找到这些对象了,但是我不知道如何从核心数据中删除它们。在本例中,我正在实体新闻中搜索过期的项目。我使用'expires'属性(int32unix时间戳)查看该数字是否小于当前unix时间戳。不确定NSPredicate在这方面是否正确 NSFetchRequest *request = [[NSFetchRequest alloc] init]; NSEntityDescription *entity = [NSEntityDescrip

我不清楚如何从核心数据数据库中删除某些对象。我想我已经可以找到这些对象了,但是我不知道如何从核心数据中删除它们。在本例中,我正在实体新闻中搜索过期的项目。我使用'expires'属性(int32unix时间戳)查看该数字是否小于当前unix时间戳。不确定NSPredicate在这方面是否正确

NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"News" inManagedObjectContext:self.managedObjectContext];
[request setEntity:entity]; 

// Set up predicate here?
NSPredicate *pred = [NSPredicate predicateWithFormat:@"expires < %i", dateInt]; // dateInt is a unix time stamp for the current time
[request setPredicate:predicate];

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"forename" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[request setSortDescriptors:sortDescriptors];
[sortDescriptors release];
[sortDescriptor release];
NSError *error;
NSMutableArray *mutableFetchResults = [[[managedObjectContext executeFetchRequest:request error:&error] mutableCopy] autorelease];
[request release];

// delete the found objects here?
NSFetchRequest*request=[[NSFetchRequest alloc]init];
NSEntityDescription*entity=[NSEntityDescription entityForName:@“News”在managedObjectContext:self.managedObjectContext]中;
[请求集合实体:实体];
//在这里设置谓词?
NSPredicate*pred=[NSPredicate PREDITEWITHFORMAT:@“expires<%i”,dateInt];//dateInt是当前时间的unix时间戳
[请求集谓词:谓词];
NSSortDescriptor*sortDescriptor=[[NSSortDescriptor alloc]initWithKey:@“forename”升序:YES];
NSArray*sortDescriptors=[[NSArray alloc]initWithObjects:sortDescriptor,nil];
[请求集合描述符:排序描述符];
[sortDescriptors发布];
[sortDescriptor发布];
n错误*错误;
NSMutableArray*mutableFetchResults=[[managedObjectContext executeFetchRequest:请求错误:&错误]mutableCopy]自动删除];
[请求释放];
//是否在此处删除找到的对象?

为每个要删除的对象调用
-[NSManagedObjectContext deleteObject:
,然后提交更改。

您可以在
iOS 9.0+
macOS 10.11+
tvOS 9.0+
watchOS 2.0+

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"expires < %i", dateInt];
NSFetchRequest *fetchRequest = [News 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);
}
NSPredicate*谓词=[NSPredicate predicateWithFormat:@“expires<%i”,dateInt];
NSFetchRequest*fetchRequest=[News fetchRequest];
[FetchRequestSetPredicate:谓词];
//创建批删除请求
NSBatchDeleteRequest*deleteReq=[[NSBatchDeleteRequest alloc]initWithFetchRequest:fetchRequest];
n错误*错误=nil;
NSBatchDeleteResult*deletedResult=[appDelegate.persistentContainer.viewContext executeRequest:deleteReq错误:&error];
如果(错误){
NSLog(@“无法删除数据”);
}
否则{
NSLog(@“%@已删除”,删除请求结果);
}

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
,那么该对象将不会被删除。

您的意思是我为数组中的每个项单步遍历mutableFetchResults数组和[managedObjectContext deleteObject:mutableFetchResultsItem]吗?是的。没有一种方便的方法可以一次删除整个数组。
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)")
}