2

嘿,我被同样的问题困扰了好几天,插入时间逐渐增加,在较低的 ipad 中,它也因内存问题而崩溃。插入 20k 条记录需要 4-5 分钟。后台线程会提高效率吗?? 无论如何我可以优化这个。如果可以的话,请帮忙。

  +(BOOL) addObjectToProfessionalsDBWithDict:(NSArray*)profArray{

if (!([profArray count]>0 && profArray )) {
    return NO;
}

NSManagedObjectContext *thisContext=[self getManagedObjectContext];


for (int i=0; i<[profArray count]; i++) {
  NSManagedObject *professionalDBObject = [NSEntityDescription
    insertNewObjectForEntityForName:@"ProfessionalsDB"
                                          inManagedObjectContext:thisContext];//initWithDictionary:objectDict];        NSMutableDictionary * objectDict=[profArray objectAtIndex:i];
 [professionalDBObject setValue:[objectDict valueForKey:@"Degree"] forKey:@"degree"];
[professionalDBObject setValue:[objectDict valueForKey:@"First_Name"] 
  // and 10 more  values  

     if(i%500==0){
        NSError *error;
        NSLog(@"saved rec nu %d",i);
        if (![thisContext save:&error]) {
            NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]);
            return NO;
        }
        else{
            NSLog(@"data saved");

        }

         [thisContext reset];


   }

}



[prefs setInteger:numOfRecords forKey:@"numberOfRecords"];
NSError *error;


if (![thisContext save:&error]) {
    NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]);
    return NO;
}

return YES;

}

4

3 回答 3

3

存储 20k 条记录大约需要 4 分钟。我使用以下代码将其缩短到 8 秒(这真的很棘手!):

  +(NSManagedObjectContext*)getInsertContext{
NSManagedObjectContext *thisContext=[[NSManagedObjectContext alloc] init];
AppDelegate *delegate=(AppDelegate*)[[UIApplication sharedApplication] delegate];
NSPersistentStoreCoordinator *coordinator = [delegate persistentStoreCoordinator];
[thisContext setPersistentStoreCoordinator:coordinator];
[thisContext setUndoManager:nil];

return thisContext;

}

在我保存在此上下文中的每 1000 条记录上,在保存重置并再次获取新上下文后:

    [thisContext reset];
        thisContext=[self getInsertContext];
于 2013-11-07T10:06:49.380 回答
2

启动时将种子数据插入数据库,原则上没有问题。复制现成的 Core Data 数据库肯定很快,但准备和保持更新也很麻烦。

这里有一些想法:

1)重写for循环,以便您遍历批次并有一个内部循环遍历记录。将两个循环括在单独的@autoreleasepool括号中。

2)考虑从字典中检索值时更改valueForKey为。objectForKey区别很微妙,但很重要。

3)澄清你thisContext来自哪里。它是应用程序的主要上下文还是子上下文。在后一种情况下,保存实际上不会写入数据库,直到父级也保存。

4) 考虑performBlock托管对象上下文的 API,它为您提供额外的线程和内存隔离。

于 2013-08-31T19:15:58.810 回答
0

您应该随捆绑包中已经创建的这个数据库一起提供。

于 2013-08-31T17:40:43.117 回答