2016-02-18 2 views
0

В моем проекте у меня есть два объекта: personEntity & municipalEntity. Они имеют много-много обратных отношений друг с другом. Я исполняю NSFetchRequest на personEntity, чтобы получить подробную информацию человека:Запросы на выбор вложений

let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate 
    let context = appDelegate.managedObjectContext 
    let personRequest = NSFetchRequest(entityName: "personEntity") 
    let personPred = NSPredicate(format: "surname = %@", "Smith") 
    personRequest.predicate = personPred 
    do { 
     let personsList = try context.executeFetchRequest(personRequest) 
     // this all clear enough up to this point 

На данный момент, я пытаюсь гнездо второй, основывается FetchRequest внутри первого. Этот запрос должен искать municipalEntity в свойстве отношений peopleInMunicipality, для объектов от personsList.

 for selectedPeople in personsList { 
      let municipalRequest = NSFetchRequest(entityName: "municipalEntity") 
      let municipalPred = NSPredicate(format: "peopleInMunicipality = %@", selectedPeople) 
      municipalRequest.predicate = municipalPred 
      do { 
       let municipalitiesWithResidentsCalledSmithList = try context.executeFetchRequest(municipalRequest) 

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

  let municipalPred = NSPredicate(format: "peopleInMunicipality = %@", argumentArray: selectedPerson as? [AnyOject]) 

Компилятор теперь счастлив, но когда я запускаю код, он падает с ошибкой EXC_BAD_ACCESS на секции кода предложил argumentArray:. Любая идея, как я могу это исправить?

+1

Может быть, я ошибаюсь, но если у вас есть много-ко-многим есть атрибут в каждом объекте со ссылкой на другое лицо. После того, как вы отфильтровали людей, вы можете получить связанные предметы 'communityEntity' из указанного атрибута каждого человека. – vadian

+0

Это в значительной степени то, что я пытаюсь сделать. Если у объекта есть атрибут, я могу запустить предикат (как в первом цикле). Если свойство является отношением, то должен применяться тот же подход. Мне не хватает синтаксиса для сравнения объекта в отношении сущности с эталонным объектом. «Object =% @», возможно, неправильный подход. –

+0

Чтобы быть ясным: объект имеет свойства. Свойство может быть атрибутом или отношением. Вадиан говорит об атрибутах и ​​отношениях. – Willeke

ответ

1

vadian is right. Вам не нужен второй запрос на выборку. Если обратное отношение peopleInMunicipality называется municipalities, муниципалитеты selectedPeople составляют selectedPeople.municipalities.

Если вы действительно хотите выполнить второй запрос на выборку, формат предиката будет peopleInMunicipality CONTAINS %@.

+0

Хорошо. Я еще не пробовал. Я нашел, как заставить мой код работать. Строка, определяющая вложенный предикат, который работает: ... let urbanPred = NSPredicate (формат: «peopleInMunicipality =% @», selectedPeople as! NSManagedObject) –

+0

Вы уверены, что 'peopleInMunicipality' - это отношение ко многим? – Willeke

0

Поскольку я не могу оставлять комментарии. Вы можете попробовать подзапрос на MunicipalEntity так:

 NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SUBQUERY(peopleInMunicipality, $person, $person.surname == %@)[email protected] > 0", @"Smith"]; 

Использование этого предикат на муниципальном образовании

+1

Или просто без подзапроса 'ANY peopleInMunicipality.surname =% @' – Willeke