コンテキスト内のすべてのコア データ エンティティを取得するために を使用しており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
.