我有一个使用核心数据的iPhone / iPad应用程序。
在我的数据库中,我只有一个表,虽然它是一个非常大的表(大约40列)。 当我构建数据库时,我创建并插入大约13,000个新实体,然后我调用'saveContext'。
for (NSArray *singleDiamond in allDiamonds)
{
@try
{
if (//Some validation)
{
Diamond *diamond = [NSEntityDescription insertNewObjectForEntityForName:NSStringFromClass([Diamond class])
inManagedObjectContext:self.managedObjectContext];
//Do setup for diamond...
}
}
@catch (NSException *exception) {NSLog(@"%@",[exception message]);}
}
NSLog(@"Start Saving Context...");
[self saveContext];
NSLog(@"End Saving Context...");
我的问题是只有'saveContext'方法才能执行 23秒。这是不可接受的。
我做错了吗? 我怎样才能提高性能呢?
答案 0 :(得分:4)
您应在批量插入期间多次调用 saveContext ,然后调用重置以“忘记”以前插入的托管对象。例如,在我的情况下,我每100个对象保存上下文。此外,您应该为导入创建专用上下文并对其进行优化(通过将undomanager设置为nil,因为您不需要对整个插入进行反转/撤消)。 请在此处阅读:http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdImporting.html
答案 1 :(得分:4)
保存13.000件物品需要一段时间。
首次启动应用程序时是否仅保存了13.000项目,如果是这样,为什么不将数据库作为应用程序的有效负载提供。 因此,当数据库尚未存在时,只需从包中复制一个。