CoreData上的Core Data“save”操作性能不佳

时间:2011-11-15 10:19:29

标签: iphone ios sqlite core-data nsmanagedobjectcontext

我有一个使用核心数据的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秒。这是不可接受的。

我做错了吗? 我怎样才能提高性能呢?

2 个答案:

答案 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项目,如果是这样,为什么不将数据库作为应用程序的有效负载提供。 因此,当数据库尚未存在时,只需从包中复制一个。