NSFetchedResultsController для возврата объектов с уникальным свойством

#cocoa-touch #core-data #nsfetchedresultscontroller

#cocoa-touch #core-данные #nsfetchedresultscontroller

Вопрос:

У меня есть правильно настроенный NSFetchedResultsController , который возвращает все объекты, которые я хочу. Однако я хочу настроить его так, чтобы он возвращал только объекты, уникальные по ID значению, потому что в БД есть несколько повторяющихся объектов, которые имеют одинаковые ID , но другие разные свойства.

Я попытался настроить его так, как указано в документации, и в итоге получил этот результат:

 fetchRequest.returnsDistinctResults = YES;
fetchRequest.propertiesToFetch = @[@"eventCategoryID", @"eventName", @"eventID", @"eventPeopleCount", @"eventPrice", @"eventCrewCount", @"eventStartDateTS", @"eventImageURL", @"shouldShowFriends", @"isLiked"];
  

Однако они говорят, что вы должны использовать это свойство только с NSDictionaryResultType . И, более того, это вызывает у меня странный сбой.

Каковы подходы к созданию объектов, возвращаемых NSFetchedResultsController фильтруемыми, чтобы иметь настраиваемое уникальное свойство, такое как ID?

Комментарии:

1. «Странный сбой»? Что за сообщение об ошибке?

Ответ №1:

Итак, вы хотите найти все объекты, у которых ID свойство уникально? Тогда да, NSDictionaryResultType — это правильный путь. Я думаю, вам понадобятся две выборки.

Сначала создайте запрос на выборку, чтобы получить все ID значения, и подсчет для каждого значения. Используйте NSExpressionDescription, чтобы применить @count функцию к вашим результатам, и используйте NSDictionaryResultType. Группировать по ID . Пошаговый пример находится наhttp://mattconnolly.wordpress.com/2012/06/21/ios-core-data-group-by-and-count-results /.

Теперь у вас будет словарь с ключами для ID и их количеством ID . Отфильтруйте этот словарь так, чтобы у вас были только ID s, где количество было равно 1, и извлеките только эти ID значения. Теперь вы можете создать второй запрос на выборку на основе ID IN ... вашего массива одноэлементных ID элементов.

Возможно, можно было бы создать более сложный исходный запрос на выборку, чтобы возвращать только count = 1 ID с.