我有一个包含200个数字(项目ID)的数组,我希望使用其项目ID从每个项目的核心数据中获取一些数据。我假设唯一的方法是在每次迭代中执行fetchRequest的循环中查询核心数据,并将结果添加到可变数组中。这似乎是一个内存耗尽,循环超过200项可能不是获取我需要的数据的最佳方式。
所有这些数据的目的地都是一个表,所以我想使用NSFetchedResultsController,但这可能要求太多。
当您有几百个要查询的项目时,从核心数据中检索数据的最佳方法是什么?
说明性的代码示例将是最受欢迎的。
这是我的代码:
- (NSFetchedResultsController *)fetchedResultsController {
if (_fetchedResultsController != nil) {
return _fetchedResultsController;
}
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription
entityForName:@"Shows" inManagedObjectContext:managedObjectContext];
[fetchRequest setEntity:entity];
NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"downloadCount" ascending:NO];
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"showId IN %@", resultsArray];
[fetchRequest setPredicate:predicate];
[fetchRequest setFetchBatchSize:20];
NSFetchedResultsController *theFetchedResultsController =
[[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
managedObjectContext:managedObjectContext
sectionNameKeyPath:nil
cacheName:nil];
self.fetchedResultsController = theFetchedResultsController;
_fetchedResultsController.delegate = self;
[sort release];
[fetchRequest release];
[theFetchedResultsController release];
return _fetchedResultsController;
}
答案 0 :(得分:5)
最好使用谓词。例如:
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
// Set the entity for the fetch request.
NSEntityDescription *entity = [NSEntityDescription entityForName:@"EntityName" inManagedObjectContext:managedObjectContext];
[fetchRequest setEntity:entity];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"myID IN %@", IDArray];
// Set the predicate for the fetch request.
[fetchRequest setPredicate:predicate];
// Perform the fetch.
NSError *error;
NSArray *array = [managedObjectContext executeFetchRequest:fetchRequest error:&error];
[fetchRequest release];
这是一个粗略的例子,因为我不知道您的ID的形式或核心数据中的内容,但基本上您只能搜索核心数据中存储在数组中的ID,并且可以进一步实现谓词到如果需要,只返回某些值。这至少应该让你开始