代码之家  ›  专栏  ›  技术社区  ›  Ankish Jain

ios Coredata大型集合插入

  •  2
  • Ankish Jain  · 技术社区  · 11 年前

    嘿,我已经被同样的问题困扰了好几天,插入时间逐渐增加,在较低的ipad中,它也会因内存问题而崩溃。插入2万条记录需要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;
    

    }

    3 回复  |  直到 11 年前
        1
  •  3
  •   Ankish Jain    11 年前

    存储2万条记录大约需要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];
    
        2
  •  2
  •   Mundi    11 年前

    在启动时将种子数据插入数据库原则上没有问题。复制现成的核心数据数据库当然很快,但准备和更新也很麻烦。

    以下是一些想法:

    1) 重写for循环,以便在批中进行迭代,并使内部循环在记录中进行迭代。将两个环路封装到单独的环路中 @autoreleasepool 括号。

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

    3) 明确您的 thisContext 来自。是应用程序的主上下文还是子上下文。在后一种情况下,在父级也进行保存之前,保存不会实际写入数据库。

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

        3
  •  0
  •   coneybeare    11 年前

    您应该附带已经在捆绑包中创建的这个DB。