1

我的核心数据代码耗时太长,所以我注释掉了大部分行,将其简化为:

    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线路,那么保存根本不需要很长时间。但是有了这条线,保存大约需要一分钟。在此之前,数据存储中没有其他内容。为什么会发生这种情况?

4

2 回答 2

0

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

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

于 2012-09-19T13:12:59.837 回答
0

[newContext save:&error];

在 for 循环之外。不需要每次都运行。

它会解决你的问题。

于 2012-09-17T20:22:07.677 回答