0

我试图在核心数据中创建一个像文件夹一样的实体,就像在 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”而终止应用程序,原因:“在实体中找不到密钥路径文件夹”。

我怎样才能解决这个问题?我被这个问题难住了。

Folder实体与书签实体是一对多的关系,书签实体有以下属性,title,url。Folder 有以下属性,title、displayOrder、isFolder。

4

1 回答 1

0
NSPredicate *pred = [NSPredicate predicateWithFormat:@"folder == %@", self.folder];  

当您的实体是书签时,此行很好。如果您只是将实体更改为文件夹,并保留此谓词,则提取请求将查找folder文件夹实体上的键,根据您上面的数据模型描述,该键不存在。如果要获取所有文件夹,请不要设置谓词。

要允许文件夹包含文件夹,您需要定义从文件夹实体到自身的关系,如下所示:

在此处输入图像描述

在这里,Folder 实体有两个关系,一个称为子文件夹的一对多关系,以及它的逆关系,一个称为父文件夹的一对一关系。顶级文件夹nil为其父文件夹。

在获取文件夹中包含的文件夹时,您可以简单地使用由返回的集合folder.subfolders,或者使用获取请求谓词 where "parentFolder == %@",folder

于 2012-12-15T08:46:22.900 回答