核心数据:类似文件夹的功能

时间:2012-12-15 06:40:26

标签: ios xcode core-data

我试图在核心数据中创建一个像文件夹一样的实体,就像在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。

1 个答案:

答案 0 :(得分:0)

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

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

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

enter image description here

这里的Folder实体有两个关系,一个叫做子文件夹的to-many关系,以及一个名为parentFolder的反向关系。顶级文件夹的parentFolder为nil

获取文件夹中包含的文件夹时,您只需使用folder.subfolders返回的集合,或"parentFolder == %@",folder所在的获取请求谓词。