Результаты выборки CoreData с 3 сущностями и отношениями «многие ко многим» - PullRequest
0 голосов
/ 09 августа 2011

У меня есть DataModel, в которой есть сущности Category, SubCategory и DetailItem. Категория имеет 1-ко-многим в подкатегории. Каждая подкатегория имеет отношение 1-ко-многим к DetailItem. Таким образом, у категории есть набор подкатегорий, а для каждой подкатегории - набор подробных элементов.

Категория имеет свойство Set подкатегорий и свойство Name. Подкатегория имеет свойство Set подробных элементов, свойство имени и родительское свойство категории

Мой вопрос заключается в том, как я могу использовать NSFetchedResultsController для извлечения всех подробных элементов из данной подкатегории в данной категории.

Я пытаюсь что-то вроде этого, но я думаю, что мой NSPredicate неверен

 if (__fetchedResultsController == nil) {
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"DetailedItem" inManagedObjectContext:[self managedObjectContext]];
    [fetchRequest setEntity:entityDescription];

     NSPredicate *predicate = [NSPredicate predicateWithFormat:@"Category.name CONTAINS[c] 'Movies'"];

    [fetchRequest setPredicate:predicate];


    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES]; // probably not needed
    [fetchRequest setSortDescriptors:[NSArray arrayWithObject:sortDescriptor]];

    NSFetchedResultsController *fetchedResults = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:[self managedObjectContext] sectionNameKeyPath:nil cacheName:@"AllItems"];
    fetchedResults.delegate = self;
    __fetchedResultsController = fetchedResults;

    NSError *error;
    if (![__fetchedResultsController performFetch:&error]) {
        NSLog(@"Error fetching");
    }

    [sortDescriptor release];
    [fetchRequest release];
}

Цель состоит в том, что если Category == Food and SubCategory == Meat, то я получаю список всех подробных элементов, которые подпадают под эту категорию и подкатегорию. Если что-то не понятно, я постараюсь предоставить больше контекста.

1 Ответ

1 голос
/ 10 августа 2011

Если ваша модель данных выглядит следующим образом:

Category{
  name:string
  subCategories<-->>SubCategory.category
}

SubCategory{
  name:string
  category<<-->Category.subCategories
  detailedItems<-->>DetailItem.subCategory
}

DetailedItem{
  name:string
  subCategory<<-->SubCategory.detailedItems
}

... и вам нужна таблица из DetailedItem объектов, вы устанавливаете объект выборки на DetailedItem, а затем все ваши ключевые пути начинаются сDetailItem сущность.

Если у вас есть только имена объектов Category и SubCategory, вы можете создать такой предикат, как:

 NSPredicate *p = [NSPredicate predicateWithFormat:@"subCategory.name==%@ AND subCategory.category.name==%@", subCatName,catName];

Обратите внимание, что если у вас есть повторяющиеся значения имен в любой сущностиобъекты, вы получите все соответствующие объекты.

Если у вас есть действительные объекты Category и SubCategory, вы можете выполнить более быстрый тест с помощью:

 NSPredicate *p = [NSPredicate predicateWithFormat:@"subCategory==%@ AND subCategory.category==%@", aSubCatObj,aCatObj];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...