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、保存にそれほど時間はかかりません。しかし、その行では、保存に約 1 分かかります。これより前のデータ ストアには他に何もありません。これが起こっている理由は何ですか?

4

2 に答える 2

0

実行目的(速度)だけでなく、ループの外側に置くことに同意しますが、ループで何か問題が発生した場合、半分またはデータを保存し、残りの半分を保存しないためです。ほとんどの場合、ユーザーはすべてまたはまったく期待していません。それ以外の場合は、コードとして、どのエントリが正しく保存され、どのエントリが保存されていないかを判断します。

つまり、1.. 実行時間と 2. 管理容易性のためです。

于 2012-09-19T13:12:59.837 に答える
0

置く

[newContext save:&error];

for ループの外側。毎回実行する必要はありません。

それはあなたの問題を解決します。

于 2012-09-17T20:22:07.677 に答える