0

我正在尝试编写一个应用程序来枚举拖到主应用程序窗口上的文件夹和项目,然后为它找到的每个 PDF 放置一个新条目到我的核心数据数据库中,然后填充一个 NSTableView。长话短说[er],我已经到了可以安全地将一些项目拖到窗口中并保存数据库的阶段,允许我一次又一次地重新启动应用程序。

我遇到的问题是,如果我 [说] 将我的 Documents 文件夹拖到窗口上,它似乎一切正常,但是当我退出并尝试重新启动时,它会崩溃并出现

Thread 1: EXC_BAD_ACCESS (code=2, address-0x7fff6f11dff8

我目前正在使用的代码(专门为调试这个问题而编写)是:

    NSError *error;
    id firstObject = [draggedStuff objectAtIndex:0];
    NSDictionary *fileAttribs = [[NSFileManager defaultManager] attributesOfItemAtPath:firstObject error:&error];
    if ([[fileAttribs valueForKey:NSFileType] isEqualTo:NSFileTypeDirectory]) {
        NSManagedObject *aNewFolder = [[NSManagedObject alloc]initWithEntity:[NSEntityDescription entityForName:kFOLDERS_ENTITY inManagedObjectContext:[self managedObjectContext]] insertIntoManagedObjectContext:[self managedObjectContext]];
        [aNewFolder setValue:firstObject forKey:kFOLDER_PATH];
        NSArray *directoryContents = [[NSFileManager defaultManager] subpathsOfDirectoryAtPath:firstObject error:&error];
        assert(!error);
        [directoryContents enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
            CFStringRef fileExtension = (__bridge CFStringRef) [obj pathExtension];
            CFStringRef fileUTI = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, fileExtension, NULL);
            if (UTTypeConformsTo(fileUTI, kUTTypePDF)) {
                NSManagedObject *aDocument = [[NSManagedObject alloc]initWithEntity [NSEntityDescription entityForName:kDOCO_ENTITY inManagedObjectContext:[self managedObjectContext]] insertIntoManagedObjectContext:[self managedObjectContext]];
                [aNewPicture setValue:obj forKey:@"docoPath"];
            }
            CFRelease(fileUTI);
            if (idx % 20 == 0) {
                NSError *error;
                [[self managedObjectContext] save:&error];
                assert(!error);
            }
        }];
    }

最初,我在一个 NSOperation 子类中有这个,并带有相关检查用户取消,但我已经将它移到主线程只是为了确保它与它无关,所以,是的,它目前不是用户 -友好的一段代码。

崩溃肯定与directoryContents返回的项目数量有关,因为如果我拖动一个里面只有大约 20 个项目的文件夹,它工作得非常好。如果directoryContents拥有大约 200 个或更多文件,那么 Core Data 似乎无法正确保存它并损坏了 storedata 文件,在我重新启动应用程序之前需要将其删除。

if (idx % 20 == 0)...可以更改为保存更多或更少的 NSManagedObjects 等待保存,但结果也相同。

我也尝试过使用具有相同结果的 NSDirectoryEnumerator:损坏总是与文件夹中的项目数有关。

我喜欢 Core Data,但有时我会迷失方向,因此非常感谢任何帮助,尤其是考虑到这篇文章的长度!

托德。

4

1 回答 1

0

事实证明它比我想象的要简单得多:我设法错误地连接了我的 NSTable。

我已将 NIB 中的 Table View 和 Table 列连接到实体......哎呀。

于 2012-06-20T19:03:25.987 回答