NSManagedObjectContext的countForFetchRequest需要很长时间才能生成更大的对象图

时间:2014-02-07 13:39:47

标签: ios magicalrecord

对于由sqlite数据库支持的基于CoreData的iOS应用程序。对于包含150万或更多记录的实体,使用countForFetchRequest NSManagedObjectContext方法大约需要1分钟。

有没有办法在稍微短的时间内获得计数?

虽然可以选择基于该实体中的插入/删除的内存中计数器但是如果需要通过iTunes将该sqlite数据库从一个iOS设备复制到另一个iOS设备,这将无济于事,因为iOS应用程序已启用文件共享。
sqlite数据库存储在Documents目录中。

对此有什么想法吗?

2 个答案:

答案 0 :(得分:3)

计数的速度取决于你的谓词。谓词越复杂,计数越慢。

请修改您的问题并显示谓词,以便我们可以帮助您改善其效果。

其次,您是否通过工具运行此代码以验证这是一个缓慢的计数?你可能最终会惊讶于其他一些事件正在发生,这是真正的缓慢部分。

答案 1 :(得分:2)

我通过

解决了很长时间的问题
NSManagedObjectContext* moc = [NSManagedObjectContext context];
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    [request setEntity:[NSEntityDescription entityForName:@"MyEntity" inManagedObjectContext:moc]];
    [request setPropertiesToFetch:[NSArray arrayWithObject:@"MyEntityID"]];
    [request setIncludesSubentities:NO];

    NSError *err;
    count = [moc countForFetchRequest:request error:&err];

此处'MyEntityID'被标记为索引列。使用上述方法大约需要6秒,而早期大约需要62秒才能达到150000秒