iphone - 遍历 NSFetchRequest 结果时无错误地崩溃

标签 iphone objective-c ios core-data nsfetchrequest

我正在使用 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/

相关文章:

ios - 在真实设备上调试 iAd 时变绿

iphone - 在选定的选项卡栏项目上设置文本颜色

objective-c - NSPredicate,CoreData 中的空格。如何修剪谓词?

iOS:将 UTC NSDate 转换为本地时区

ios - 为什么UIProgressView设置进度不会停止?

ios - 无论是通过手刹还是通过ffmpeg,我都无法获得1334x750的分辨率

iphone - Twitter 身份验证 OAuth 或 XAuth

iOS:popToRootViewControllerAnimated 后跟 performSegue 不起作用

ios - 自定义应用程序默认 NSDictionary

ios - 如何将数据从父 View 传递到 subview ?