对于由sqlite数据库支持的基于CoreData的iOS应用程序。对于包含150万或更多记录的实体,使用countForFetchRequest
NSManagedObjectContext
方法大约需要1分钟。
有没有办法在稍微短的时间内获得计数?
虽然可以选择基于该实体中的插入/删除的内存中计数器但是如果需要通过iTunes将该sqlite数据库从一个iOS设备复制到另一个iOS设备,这将无济于事,因为iOS应用程序已启用文件共享。
sqlite数据库存储在Documents目录中。
对此有什么想法吗?
答案 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秒