SwiftUI CoreData не в наборе отношений - PullRequest
2 голосов
/ 11 марта 2020

У меня есть структура CoreData. Это работает нормально для меня. Сейчас я пытаюсь сделать интересный FetchRequest, однако я изо всех сил пытаюсь найти правильный predicate.

У меня есть два предмета, Person и Venues. Человек может быть подключен ко многим объектам, но только один раз к тому же venue. И наоборот.

Я создал таблицу сопоставления, которая сохраняет person и venue как отношения. Здесь все отлично работает. Я даже реализовал отношения inverse.

enter image description here

На картинке слева мое место. Я хочу выбрать все persons на основе текущего места, где уже создано NO Mapping .

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

fetch.predicate = NSPredicate(format: "NOT (person IN %@)", venue!.pk_venue[HELP])

Я пришел с этим Предикатом. Тем не менее, как я могу получить доступ к людям из этого набора? Мне нужен массив / набор только из persons, которые подключены к этому текущему объекту.


Редактировать: Просто для примера.

Персона : Макс, Леон, Генри
Место : Место 1, Место 2, Место 3, Место 4

ПерсонаVenueMapping : Макс < -> Venue1

Теперь, когда я выбираю Max, я хочу Venue2 & Venue3 & Venue4

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

Ответы [ 2 ]

1 голос
/ 12 марта 2020

Ваша модель очень похожа на нормализованную модель типа базы данных. CoreData не является базой данных, поэтому некоторые требования к данным моделирования являются более гибкими при ее использовании. Например, many to many отношения возможны (и поощряются).

Создайте свою модель таким образом ...

Person
------
name: String
------
assignedVenues: Many relationship to `venue` type

Теперь у каждого отношения есть обратное свойство, поэтому ...

Venue
------
name: String
------
managers: Many relationship to `Person` type

Теперь вы можете go от Макса до назначенных ему мест, просто выполнив ...

let selectedPerson = // fetch Max from CoreData

let venues = selectedPerson.assignedVenues

Точно так же вы можете go из места, чтобы найти всех людей, управляющих это ...

let someVenue = // fetch venue from CoreData

let managers = someVenue.managers

Чтобы удовлетворить ваш вопрос о поиске всех мест, которыми Макс не управляет, вы можете теперь сделать запрос, подобный ...

let selectedPerson = //fetch Max

let predicate = NSPredicate(format:"NONE managers == %@", selectedPerson) // Its been a long time since I did CoreData so forgive me if this syntax isnt correct but the idea is correct. :D

Теперь вы можете использовать это предикат, чтобы получить все venues, где max НЕ является одним из менеджеров места.

Удалив «отображение», которое требуется в чем-то вроде SQLite et c ..., вы можете сделать многое проще для себя.

1 голос
/ 12 марта 2020

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

Поэтому ваш запрос на выборку будет для объекта Место проведения. Давайте назовем выбранного человека selectedPerson. Следующий предикат должен возвращать только те объекты, которые не имеют сопоставления, с selectedPerson:

NSPredicate(format:”SUBQUERY(pk_venue, $M, $M.person == %@).@count == 0”, selectedPerson)

или на естественном языке «выбрать объекты, для которых количество отображений ($ M), при этом person равно выбранный человек - ноль ».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...