我正在编写一个显示食谱的基于coredata的iPhone应用程序。为了提高性能,在TableView中显示它们时,我想启用批处理(-setFetchBatchSize :)并仅获取“name”属性(-setPropertiesToFetch :)。当我打开它们时,它不起作用,列表为空。一旦我注释掉下面代码中标记的其中一行,它就可以正常工作。
我在这里缺少什么?两个都不可能吗?
NSFetchRequest *fetchRequest = [[[NSFetchRequest alloc] init] autorelease];
[fetchRequest setEntity:[NSEntityDescription entityForName:@"Rezept" inManagedObjectContext:chk_context]];
// *snip*
//BATCHING
[fetchRequest setFetchBatchSize:25];
NSDictionary *entityProperties = [[NSEntityDescription entityForName:@"Rezept" inManagedObjectContext:chk_context] propertiesByName];
//PROPERTIES
[fetchRequest setPropertiesToFetch:[NSArray arrayWithObject:[entityProperties objectForKey:@"name"]]];
答案 0 :(得分:4)
我远离核心数据专家,但我在这种情况下成功地工作了。我认为setFetchBatchSize和setPropertiesToFetch之间的“冲突”更多地是核心数据如何工作的副作用而不是本身的错误。
就我而言,我做了两次。在第一个中,结果类型设置为NSManagedObjectResultType,我使用setFetchBatchSize来限制主动进入内存的数据量。在第二次获取中,我根据单个属性填充一组标题,并将结果类型设置为NSDictionaryResultType,将fetchBatchSize设置为0(无限)。
根据测试,这种情况非常有效。初始提取中的所有记录(使用实际的managedObjects)都是由fetchBatchSize引起的,并且受内存限制。第二次提取返回一个简单的标题字典。这比迭代所有实际的托管对象访问title属性所需的内存要少得多。第二次获取需要fetchBatchSize是有意义的,因为它将完全填充的字典作为单个结果返回并且批处理不合适。
我不确定我在这里是100%明确(核心数据术语有点神秘......)但最重要的是我认为一切都按预期工作。
答案 1 :(得分:2)
看起来很像你在CoreData中发现了一个错误。您可以通过打开SQL日志来确认 - 我猜这两个选项都会生成稍微无效的SQL。
您要使用的选项是“com.apple.CoreData.SQLDebug 1” - 您可以从命令行指定,或者在程序中设置默认值。
-Wil
答案 2 :(得分:0)
更新:当我在
之后NSLog错误[fetchedResultsController performFetch:&error];
我得到“NSUnderlyingException =数据库显示已损坏。(主键无效);”。但我不知道这意味着什么以及它与启用这两种方法有什么关系。
答案 3 :(得分:0)
Hunter你可以在手机上使用com.apple.CoreData.SQLDebug 1但不使用模拟器