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 Entity がNSEntityDescription *entity = [NSEntityDescription entityForName:@"Folder" inManagedObjectContext:self.context];エラーでクラッシュする場合、

*キャッチされない例外 'NSInvalidArgumentException' が原因でアプリを終了しています。理由: 'キーパス フォルダーがエンティティに見つかりません'。

どうすればこれを修正できますか? 私はこの問題に困惑しています。

Folder エンティティには、ブックマーク エンティティとの対多関係があり、ブックマーク エンティティには、title、url という属性があります。フォルダには、title、displayOrder、isFolder という属性があります。

4

1 に答える 1

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

エンティティがブックマークの場合、この行は問題ありません。folderエンティティを Folder に変更し、この述語をそのままにしておくと、フェッチ リクエストは、上記のデータ モデルの説明によれば存在しない Folder エンティティのキ​​ーを探します。すべてのフォルダーを取得する場合は、述語を設定しないでください。

フォルダーにフォルダーを含めることができるようにするには、Folder エンティティからそれ自体への関係を次のように定義する必要があります。

ここに画像の説明を入力

ここで、Folder エンティティには、サブフォルダーと呼ばれる対多の関係と、その逆の、parentFolder と呼ばれる対 1 の関係の 2 つの関係があります。最上位フォルダーにはnil、parentFolder があります。

フォルダに含まれるフォルダをフェッチするときは、単に によって返されるセットを使用するfolder.subfoldersか、フェッチ リクエストの述語 where を使用し"parentFolder == %@",folderます。

于 2012-12-15T08:46:22.900 に答える