循环通过阵列&从Core-Data获取数据

时间:2011-06-04 20:15:50

标签: iphone ios core-data

我有一个包含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;    

}

1 个答案:

答案 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,并且可以进一步实现谓词到如果需要,只返回某些值。这至少应该让你开始