Objective-C 核心数据顺序读取循环
Objective-C Core Data sequential read loop
我需要从前到后循环遍历核心数据数据库,看来我唯一的选择是 1) 通过一次提取将整个数据库加载到数组中,或者 2) 使用键来递增我的逐个对象地通过数据库对象的方式。
我根本没有在文档中的任何地方看到类似 'read next' 的内容。我可以做一些努力,但它看起来很傻。请告诉我我遗漏了一些非常明显的东西。
解决方案代码....
我按照下面其中一位发帖人的要求张贴了一些代码片段:
fetchedObjects = nil;
fetchedObjects = [[NSMutableArray alloc] init];
localxmlBlock = [[NSData alloc] init];
savedFetchOffset = 0;
NSFetchRequest *fetch = [[NSFetchRequest alloc] init];
NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Item" inManagedObjectContext: localFindItDataController.managedObjectContext];
[fetch setEntity:entityDescription];
[fetch setFetchLimit:1];
[fetch setFetchOffset:savedFetchOffset];
NSSortDescriptor *sortDescriptor1 = [[NSSortDescriptor alloc] initWithKey:@"itemAttribute1" ascending:YES];
NSSortDescriptor *sortDescriptor2 = [[NSSortDescriptor alloc] initWithKey:@"itemUniqueID" ascending:YES];
[fetch setSortDescriptors:[NSArray arrayWithObjects:sortDescriptor1, sortDescriptor2, nil]];
nsarrayFetchedObjects = [localFindItDataController.managedObjectContext executeFetchRequest:fetch error:&error];
if ([nsarrayFetchedObjects count] != 0) {
do {
do a whole great big bunch of stuff
savedFetchOffset++;
[fetch setFetchOffset:savedFetchOffset];
nsarrayFetchedObjects = [localFindItDataController.managedObjectContext executeFetchRequest:fetch error:&error];
} while ([nsarrayFetchedObjects count] != 0);}
不是有史以来最伟大的代码,但确实说明了它的工作原理
我认为最接近您要查找的是 fetchOffset
,还有 fetchLimit
,也许还有 fetchBatchSize
。这些在 Apple 文档 here.
中有描述
我应该提一下,一个一个地获取每个对象的效率可能非常低 - 尽管有内存开销,但一次获取更大的 batches/all 可能会更好。
我需要从前到后循环遍历核心数据数据库,看来我唯一的选择是 1) 通过一次提取将整个数据库加载到数组中,或者 2) 使用键来递增我的逐个对象地通过数据库对象的方式。
我根本没有在文档中的任何地方看到类似 'read next' 的内容。我可以做一些努力,但它看起来很傻。请告诉我我遗漏了一些非常明显的东西。
解决方案代码....
我按照下面其中一位发帖人的要求张贴了一些代码片段:
fetchedObjects = nil;
fetchedObjects = [[NSMutableArray alloc] init];
localxmlBlock = [[NSData alloc] init];
savedFetchOffset = 0;
NSFetchRequest *fetch = [[NSFetchRequest alloc] init];
NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Item" inManagedObjectContext: localFindItDataController.managedObjectContext];
[fetch setEntity:entityDescription];
[fetch setFetchLimit:1];
[fetch setFetchOffset:savedFetchOffset];
NSSortDescriptor *sortDescriptor1 = [[NSSortDescriptor alloc] initWithKey:@"itemAttribute1" ascending:YES];
NSSortDescriptor *sortDescriptor2 = [[NSSortDescriptor alloc] initWithKey:@"itemUniqueID" ascending:YES];
[fetch setSortDescriptors:[NSArray arrayWithObjects:sortDescriptor1, sortDescriptor2, nil]];
nsarrayFetchedObjects = [localFindItDataController.managedObjectContext executeFetchRequest:fetch error:&error];
if ([nsarrayFetchedObjects count] != 0) {
do {
do a whole great big bunch of stuff
savedFetchOffset++;
[fetch setFetchOffset:savedFetchOffset];
nsarrayFetchedObjects = [localFindItDataController.managedObjectContext executeFetchRequest:fetch error:&error];
} while ([nsarrayFetchedObjects count] != 0);}
不是有史以来最伟大的代码,但确实说明了它的工作原理
我认为最接近您要查找的是 fetchOffset
,还有 fetchLimit
,也许还有 fetchBatchSize
。这些在 Apple 文档 here.
我应该提一下,一个一个地获取每个对象的效率可能非常低 - 尽管有内存开销,但一次获取更大的 batches/all 可能会更好。