我有一个使用Core Data的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...");

我的问题ID仅是'saveContext'方法,需要 23秒来执行。那是不可接受的。

我做错了什么吗?
如何改善此处的性能?

最佳答案

您应该在批量插入过程中多次调用 saveContext ,然后调用 reset 以“忘记”先前插入的管理对象。例如,在我的情况下,我每100个对象保存一次上下文。此外,您应该为导入创建专用的上下文并对其进行优化(通过将undomanager设置为nil,因为您无需回滚/撤消整个插入操作)。
在这里阅读:http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdImporting.html

10-05 20:00