0

コンテキスト内のすべてのコア データ エンティティを取得するために を使用しておりNSFetchRequest、それらを別のコンテキストに移動しています。

これは、1つのエンティティだけでうまく機能します。結果を非常に迅速に反復処理できます。NSFetchRequestただし、エンティティには別のエンティティとの関係があるため、この関係によって結合されているエンティティを取得するには、もう一度実行する必要があります。NSFetchRequestクラッシュを引き起こしているのは2番目です。クラッシュにより、アプリが終了してホーム画面が表示されるだけで、xcode ログにエラーは表示されません。これが問題であることを理解するためにコードをコメントアウトし、次のようにまとめました。

    NSError *error;
    NSFileManager *manager = [NSFileManager defaultManager];

    NSManagedObjectContext *oldContext = [self version1ManagedObjectContext];
    TICDSSynchronizedManagedObjectContext *newContext = [self version1_1ManagedObjectContext];


    NSFetchRequest *oldFetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *oldEntryEntity = [NSEntityDescription entityForName:@"Entry"
                                                      inManagedObjectContext:oldContext];
    [oldFetchRequest setEntity:oldEntryEntity];
    [oldFetchRequest setFetchBatchSize:10];
    NSArray *entrys = [oldContext executeFetchRequest:oldFetchRequest error:&error];


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

    NSLog(@"total entries: %i", totalEntries);


    int i = 0;

    while (i < totalEntries) {
        @autoreleasepool {

            Entry *entry = [entrys objectAtIndex:i];

            Entry *newEntry = [NSEntityDescription
                               insertNewObjectForEntityForName:@"Entry"
                               inManagedObjectContext:newContext];

            //Taking out this fetch request means it functions fine
            NSFetchRequest *mediaRequest = [[NSFetchRequest alloc] init];

            NSEntityDescription *mediaEntity = [NSEntityDescription
                                                entityForName:@"Media"
                                                inManagedObjectContext:oldContext];

            [mediaRequest setEntity:mediaEntity];

            NSPredicate *predicate = [NSPredicate predicateWithFormat:
                                      @"(entry == %@)", entry];
            [mediaRequest setPredicate:predicate];

            NSArray *mediaItems = [oldContext executeFetchRequest:mediaRequest error:&error];

            int totalMediaItems = [oldContext countForFetchRequest:mediaRequest error:nil];

            NSLog(@"total media items: %i", totalMediaItems);


            int i2 = 0;

            while (i2 < totalMediaItems) {
                @autoreleasepool {


                    Media *newMedia = [NSEntityDescription
                                       insertNewObjectForEntityForName:@"Media"
                                       inManagedObjectContext:newContext];

                    i2++;

                }
            }

            [newContext save:&error];

            i++;
        }
    }

これが私のアプリをクラッシュさせる理由はありますか?

私がやろうとしていることについての質問への回答として、2 つのバージョン間でデータを移行しようとしています。マッピングを使用した標準のデータ移行は、NSData.

4

2 に答える 2

1

ビルドに使用しているスキームを編集して、診断タブのすべてを有効にすることをお勧めします。これにより、問題の原因となっている可能性のあるものが吐き出される可能性があります。

于 2012-09-20T00:09:46.510 に答える
1

ここで公開していないコード行は他にもいくつかあると思います。古いエンティティから新しいエンティティにデータをコピーするもの...
おそらく問題があります。

とにかく、コードの 2 行ごとに NSLog を追加して、どれが最後に出力されるかを確認します...
内側のループで何かが自動解放され、次の反復でそれを使用しようとしていると思います。

于 2012-09-19T21:18:51.277 に答える