添加单个实体后,为什么我的核心数据需要很长时间才能保存?

时间:2012-09-17 16:48:16

标签: iphone objective-c ios core-data nsmanagedobject

我的核心数据代码花了太长时间,所以我评论了大部分内容,将其简化为:

    NSString *storePath = [[self applicationDocumentsDirectory] stringByAppendingPathComponent:@"CoreDataStore.sqlite"];
    NSString *backupSourceStorePath = [[self applicationDocumentsDirectory]
                                       stringByAppendingPathComponent:@"CoreDataStoreBackup.sqlite"];

    NSManagedObjectContext *oldContext = [self version1ManagedObjectContext];
    TICDSSynchronizedManagedObjectContext *newContext = [self managedObjectContext];
    NSFetchRequest *oldFetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *oldEntryEntity = [NSEntityDescription entityForName:@"Entry"
                                                      inManagedObjectContext:oldContext];

    [oldFetchRequest setEntity:oldEntryEntity];

    int numberOfEntries = [oldContext countForFetchRequest:oldFetchRequest error:nil];

    int batchSize = 10;
    [oldFetchRequest setFetchLimit:batchSize];
    int offset = 0;

    while (numberOfEntries - offset > 0) {

        [oldFetchRequest setFetchOffset:offset];
        NSError *error;
        NSArray *entries = [oldContext executeFetchRequest:oldFetchRequest error:&error];

        int i = 0;
        for (NSManagedObject *entry in entries) {

            Entry *newEntry = [NSEntityDescription insertNewObjectForEntityForName:@"Entry"
                                                            inManagedObjectContext:newContext];
            i++;
            NSLog(@"i: %i", i);
        }

        [newContext save:&error];

        NSLog(@"Save error: %@", error);

        offset = offset + batchSize;

    }

如果我没有insertNewObjectForEntityForName行,那么保存不需要很长时间。但有了这条线,节省大约需要一分钟。在此之前,数据存储中没有其他任何内容。有什么理由可能会发生这种情况?

2 个答案:

答案 0 :(得分:0)

[newContext save:&error];

外面的循环。每次都不需要运行。

它会解决您的问题。

答案 1 :(得分:0)

我同意将它放在循环之外,不仅仅是出于执行目的(速度),而是因为如果循环中出现问题,你想要保存一半或你的数据然后另一半不是吗?大多数时候用户都期望全部或者没有。另外,作为代码,她要确定哪些条目正确保存,哪些条目没有保存。

所以1 ..执行时间 2.出于可管理性目的