0

我正在使用一个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.

4

2 回答 2

1

我相信您没有在这里公开的更多代码行。您将数据从旧实体复制到新实体的那些......
也许问题就在那里。

无论如何,我会在每 2 行代码之间添加 NSLog,看看哪个是最后打印的...
我认为某些东西是在内部循环中自动释放的,您尝试在下一次迭代中使用它。

于 2012-09-19T21:18:51.277 回答
1

我建议您编辑用于构建和启用诊断选项卡的所有内容的方案。这可能会吐出可能导致问题的任何原因。

于 2012-09-20T00:09:46.510 回答