mea*_*ers 2 core-data objective-c ios
我想从CoreData表中删除一个选定的项目列表:一些具有以下特定的人员namesToDelete:
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.
}
Run Code Online (Sandbox Code Playgroud)
这有效,但这是在CoreData中执行此操作的最简单/最短的方法吗?
关于最好的修剪是这样的:
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.
}
Run Code Online (Sandbox Code Playgroud)
另请注意,您检查数组是否作为成功标准返回,而不是错误输入nil.同样,save:你应该检查返回BOOL.
在iOS 9之前我们是逐个删除对象,但在iOS 9.0+我们可以批量删除它们。
您可以NSBatchDeleteRequest使用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);
}
Run Code Online (Sandbox Code Playgroud)
Swift 代码(来自上面的链接)
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)")
}
Run Code Online (Sandbox Code Playgroud)
我发现下面的评论execute关于moc
将请求传递到存储而不影响托管对象上下文内容的方法。
这意味着任何未保存的数据都moc不会受到影响。即,如果您创建/更新了符合删除请求条件的实体并且未调用save该moc实体,则该对象将不会被删除。
| 归档时间: |
|
| 查看次数: |
3426 次 |
| 最近记录: |