2016-08-16 1 views
0

Я ищу некоторую помощь в понимании NSPredicates и о том, как запросить CoreData. Вот что у меня есть:Как выполнить сложный запрос по отношению ко многим отношениям в CoreData

У меня есть два объекта: 1. Захват, представляющий «захват» некоторых данных, и он имеет множество отношений к 2. Идентификационные теги.

Я ищу по существу набор тегов «Identity» из определенного набора «Captures». то есть я хочу знать все уникальные идентификаторы имени «X» для захватов, которые также помечены идентификатором Int 'y'.

В стрижа я модель этого типа:

let captures: [Capture] 
let identities = captures.flatmap({ $0.identities }).filter({ $0.id == "y" }) 
let uniqueIdentitiesOfParticularType: Set<Identity> = Set(identities.flatMap({ $0.name }) 

Любая помощь, пожалуйста?

ответ

1

Во-первых, обязательно начинайте с Predicate Programming Guide, который более подробно описывает это. См., В частности, «Использование предикатов с основными данными».

Ваше решение, вероятно, что-то вдоль этих линий, если вы хотите, чтобы быть немного осторожным разломообразования:

let request = NSFetchRequest(entityName: "Capture") 
let id = "y" 
request.predicate = NSPredicate(format: "id == %@", id) 
let identities = try context.executeFetchRequest(request) as NSArray 
let names = identities.valueForKeyPath("@distinctUnionOfObjects.name") 

Обратите внимание, что IOS 10 добавляет лучшие мосты для этого Swift (вам не нужно as NSArray), но Я еще не изучил их.

Подробнее о @distinctUnionOfObjects и его друзьях см. Collection Operators.

+0

Спасибо, Роб! Это привело меня к правильному пути. Думаю, я подумал, что может быть лучший способ сказать CoreData для получения этих объектов за один проход, поэтому я пытался выяснить, как сделать NSPredicates делать всю работу. – Bren

+0

Просто помните, что Core Data не является базой данных. Это не произвольные записи. Это движок устойчивости объекта. Цель - поддерживать согласованный графический объект. «Извлечение» - это просто деталь реализации, потому что набор данных может не соответствовать всей памяти. Основная сила Core Data заключается в том, чтобы помочь вам перемещаться по сложной системе отношений, а не «запрашивать строки». Если у вас много независимых записей без многих фиксированных отношений, я часто нахожу базу данных лучшим инструментом. –

+1

Я ценю, что ... для этого небольшого проекта, над которым я работаю, у меня есть набор данных, который хранится в JSON локально. CoreData просто предоставил хороший способ сериализации этих данных в соответствующие объекты, поддерживать то, как они связаны друг с другом, и взаимодействовать с ними. Я думаю, что, изучая это решение, я, возможно, пытаюсь переусердствовать, думая, что есть лучший способ взглянуть на все объекты, возвращенные приемом. – Bren

Смежные вопросы