2015-04-10 4 views
2

Доброе утро,IOS Swift Основные данные подсчета дочерних объектов

У меня есть родительский объект, позволяет назвать его окрестности, которая логически обладает дочерние объекты, дома. В моей модели Core Data эти объекты не связаны посредством отношения (пока). Кроме того, фактическая взаимосвязь между объектами управляется приложением на стороне сервера, которое является системой записи для отношений внешнего ключа и всех данных. В приведенных ниже схемах вы заметите, что есть свойства id и foreign_id. Эти значения предоставляются сервером.

Район имеет следующую схему:

id int32 
name string 

Дом имеет следующую схему:

id int32 
neighborhood_id int32 
address string 
has_completed_build boolean 

Если у меня есть 5000 кварталов в локальной базе данных с 20 домов в каждом, как можно эффективно вернуть все 5 000 кварталов с подсчетом детских домов, что has_completed_build = true и has_completed_build = false? Я не думаю, что могу даже связать эти два сущности через отношения, потому что это отношение определяется ключами, внешними по отношению к ios. Можно ли это управлять с помощью выбранного свойства?

Прямо сейчас я прохожу через каждую окрестность и запрашиваю каждую строку для подсчета детей на House.neighborhood_id = Neighborhood.id.

Заранее спасибо.

+0

Если вы не хотите (или я согласен в этом случае, не могу) использовать отношения с основными данными, почему бы не посмотреть на sqlite? – Paulw11

+0

@ Paulw11 Да ... не плохая идея. Мое решение использовать основные данные было задумано, так как я не понимал, как эти отношения управляются. Мое предположение заключалось в том, что с помощью Core Data можно было определить отношения FK - так работают большинство ORM. – a432511

+0

CoreData может сохраняться в SQLite и имеет отношения, но это не RDBMS - вы не можете действительно присоединиться, например, что это похоже на то, что вам нужно – Paulw11

ответ

0

В соответствии с комментариями вы можете сделать выборку, сгруппированную по neighborhood_id и has_completed_build, чтобы получить подсчеты, а затем отдельную выборку, чтобы получить имя для neighborhood_id. Что-то вроде этого:

let fetch = NSFetchRequest(entityName: "House") 
    let countExpression = NSExpression(format: "count:(id)") 
    let countED = NSExpressionDescription() 
    countED.expression = countExpression 
    countED.name = "countOfHouses" 
    countED.expressionResultType = .DoubleAttributeType 
    fetch.propertiesToFetch = ["neighborhood_id", "has_completed_build", countED] 
    fetch.resultType = .DictionaryResultType 
    fetch.propertiesToGroupBy = ["neighborhood_id", "has_completed_build"] 
    let houseCounts = managedObjectContext?.executeFetchRequest(fetch, error: nil) 

Это поможет вам множество словарей, каждый из словаря, имеющий ключи «neighborhood_id», «has_completed_build» и «countOfHouses». Боюсь, что мои навыки Swift не позволяют найти эффективный способ поиска значений из этой структуры (эффективно для соединения). Я подумаю об этом еще немного, но надеюсь, что это поможет вам начать в то же время.

+0

Отлично. Я проверю это, и если это сработает, я буду отмечать это как ответ. Приветствия. – a432511

+0

Это работало очень хорошо. И для полноты вы можете фильтровать результирующий массив словарей в swift с помощью myArray.filter() {$ 0 ["has_completed_build"] ?. boolValue! = Nil && $ 0 ["has_completed_build"] ?. boolValue! == true}; – a432511

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