我正在尝试编写一个应用程序,该应用程序枚举通过拖动到主应用程序窗口的文件夹和项目,然后将它找到的每个PDF的新条目放入我的Core Data数据库,然后再填充NSTableView。简而言之,我已经到了一个阶段,我可以安全地将一些项目拖到窗口中并保存数据库,这样我就可以一次又一次地重启应用程序。
我遇到的问题是,如果我[说]将我的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似乎无法正确保存它并破坏需要Trashed的storedata文件,然后才能重新启动应用程序。
if (idx % 20 == 0)...
可以更改为保存,或者更多或更少的NSManagedObjects等待保存,但结果也相同。
我也尝试使用具有相同结果的NSDirectoryEnumerator:损坏总是与文件夹中的项目数相关联。
我喜欢核心数据,但有时候我会迷失方向,所以特别是考虑到这篇文章的篇幅,我们非常感谢任何帮助!
托德。
答案 0 :(得分:0)
事实证明它比我想象的要简单得多:我设法错误地连接了我的NSTable。
我已将NIB中的Table View和Table列连接到实体....哎呀。