我正在使用 NSFetchRequest
获取上下文中的所有核心数据实体,并将它们移动到另一个上下文中。
仅用 1 个实体就可以正常工作。我可以非常快速地迭代结果。然而,该实体与另一个实体有关系,所以我需要运行第二个 NSFetchRequest
来获取通过这种关系加入的实体。这是导致崩溃的第二个 NSFetchRequest
。崩溃只是让应用程序退出到主屏幕,并且 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
。
最佳答案
我相信您没有在此处公开的代码行很少。您将数据从旧实体复制到新实体的那些...
也许问题就在那里。
无论如何,我会在每两行代码之间添加 NSLog 并查看哪一行是最后打印的...
我认为某些东西在内循环中是自动释放的,您尝试在下一次迭代中使用它。
关于iphone - 遍历 NSFetchRequest 结果时无错误地崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12502800/