我试图在核心数据中创建一个像文件夹一样的实体,就像在mac上基本上可以放置一个对象的文件,以及另一个文件夹。目前我有文件夹,个别书签(另一个实体)和书签可以在文件夹中,但我不能让文件夹进入另一个文件夹。
这是我的NSFetchedResultsController,
- (NSFetchedResultsController *)fetchedResultsController
{
if (_fetchedResultsController != nil) {
return _fetchedResultsController;
}
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
// Edit the entity name as appropriate.
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Bookmark" inManagedObjectContext:self.context];
[fetchRequest setEntity:entity];
[NSFetchedResultsController deleteCacheWithName:@"Folder"];
NSPredicate *pred = [NSPredicate predicateWithFormat:@"folder == %@", self.folder];
[fetchRequest setPredicate:pred];
// Set the batch size to a suitable number.
[fetchRequest setFetchBatchSize:20];
// Edit the sort key as appropriate.
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"title" ascending:YES];
NSArray *sortDescriptors = @[sortDescriptor];
[fetchRequest setSortDescriptors:sortDescriptors];
// Edit the section name key path and cache name if appropriate.
// nil for section name key path means "no sections".
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.context sectionNameKeyPath:nil cacheName:@"Folder"];
aFetchedResultsController.delegate = self;
self.fetchedResultsController = aFetchedResultsController;
NSError *error = nil;
if (![self.fetchedResultsController performFetch:&error]) {
// Replace this implementation with code to handle the error appropriately.
// abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
return _fetchedResultsController;
}
如果NSEntityDescription实体为NSEntityDescription *entity = [NSEntityDescription entityForName:@"Folder" inManagedObjectContext:self.context];
,则会因错误而崩溃,
* 由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'在实体中找不到keypath文件夹'。
我该如何解决这个问题?我对这个问题很难过。
文件夹实体与书签实体具有多对多关系,书签实体具有以下属性,标题,网址。 Folder具有以下属性,title,displayOrder,isFolder。
答案 0 :(得分:0)
NSPredicate *pred = [NSPredicate predicateWithFormat:@"folder == %@", self.folder];
当您的实体是书签时,此行很好。如果您只是将实体更改为文件夹,并将此谓词保留在原位,那么获取请求将在文件夹实体上查找键folder
,根据您上面的数据模型描述,该实体不存在。如果要获取所有文件夹,请不要设置谓词。
要允许文件夹包含文件夹,您需要定义从Folder实体到其自身的关系,如下所示:
这里的Folder实体有两个关系,一个叫做子文件夹的to-many关系,以及一个名为parentFolder的反向关系。顶级文件夹的parentFolder为nil
。
获取文件夹中包含的文件夹时,您只需使用folder.subfolders
返回的集合,或"parentFolder == %@",folder
所在的获取请求谓词。