#iphone #objective-c #core-data #entity-relationship #nspredicate
#iPhone #objective-c #core-data #сущность-связь #nspredicate
Вопрос:
У меня есть объект Car
и сущность Race
. У обоих объектов есть атрибут с именем carClass
. Моя проблема в том, что я хочу создать связь между ними при объединении с помощью carClass
.
По сути, я хочу создать связь в основных данных, которая будет представлять возможных участников гонки, в зависимости от carClass
, другими словами, если я создаю гонку с определенным carClass
номером и вызываю competitors
на эту гонку, я хочу получить список автомобилей с одинаковым номером carClass
.
Мой вопрос в том, возможно ли это создать с помощью Core Data relations
, я подумываю о том, чтобы просто добавить NSPredicate
к отношению.
Заранее спасибо.
Обновить
Я думаю, что я не объяснил четко, чего я хочу достичь.
Car{
carClass:string
}
Race{
carClass:string
competitors<-->>cars.carClass == carClass
}
И competitors
должно быть выбрано автоматически, поэтому мне не нужно добавлять конкурентов вручную, он должен извлечь все подходящие автомобили из модели автомобилей.
Ответ №1:
Простейшая модель выглядела бы примерно так:
CarClass{
name:string
race<-->Race.carClass
cars<-->>Car.carClass
}
Car{
name:string
carClass<<-->CarClass.cars
}
Race{
name:string
carClass<-->>CarClass.race
}
Не думайте об этом в терминах SQL, думайте об этом в терминах объекта. Каждый объект должен представлять объект реального мира, событие или условие, которое вы хотите смоделировать. Отношения между объектами должны имитировать отношения реального мира. Если и Race
, и Car
объекты реального мира имеют общую связь с CarClass
условием, то вы просто помещаете это в модель.
В отличие от SQL, объектные модели могут быть сколь угодно сложными и они также могут содержать поведение. Вы не просто застряли с таблицами, столбцами и строками.
Обновить:
(Смотрите обновление в OP для справки)
Когда вы обнаруживаете, что помещаете одно и то же значение атрибута в два или более разных объекта, это обычно означает, что вам нужно создать новый объект для моделирования этого значения.
В этом случае, хотя с точки зрения данных значение carClass является просто строкой, логически это совершенно отдельная вещь, которая связана как с Race
, так и Car
с объектами. Итак, чтобы точно смоделировать это, вам нужно предоставить для этого отдельный объект. Кроме того, вам нужно смоделировать конкурентов, поэтому вам нужна модель, которая выглядит примерно так:
CarClass{
class:string
race<-->Race.carClass
cars<-->>Car.carClass
}
Car{
name:string
carClass<<-->CarClass.cars
competitor<-->>Competitor.car
}
Race{
name:string
carClass<-->CarClass.race
}
Competitor{
name:string
car<-->Car.competitor
}
(Обратите внимание, что эта модель предполагает, что все расы определяются их классом автомобиля, а не отдельными транспортными средствами или водителями.)
Итак, чтобы найти всех участников определенной гонки, вам пришлось бы пройти пешком Race.carClass.cars.competitor
.
Возможно, это не совсем то, что вы хотите, но вы можете получить представление о том, как вы используете сущности и отношения для моделирования объектов реального мира, событий или условий и связей между ними.
Комментарии:
1. спасибо за ваш ответ, я обновил свой вопрос, потому что, по-моему, я недостаточно хорошо объяснил свою проблему. Спасибо.
2. Если я правильно понимаю, я должен создать класс с именем
carClass
вместо использования просто строки, и я должен создать связь сCar
классом, а также сRace
классом. Затем используйтеRace.carClass.cars
, чтобы получить список автомобилей из этогоcarClass
.3. Да, это логически свяжет все данные воедино. Конечно, ваша фактическая модель может отличаться в деталях, но вы уловили идею. Когда одно и то же значение отображается в двух существующих объектах, и вы обнаруживаете, что извлекаете оба на основе этого значения, тогда значению, вероятно, нужна своя собственная сущность и отношения.
Ответ №2:
Конечно, это возможно. Но почему бы просто не проверить каждый класс cars при настройке гонки и добавить автомобиль в гонку, если класс совпадает?
Комментарии:
1. Требуется обработать слишком много обращений. Что, если я добавлю больше машин после создания гонки? Я должен снова добавить их вручную. Также это решение не очень согласовано. Но если вы сможете показать мне концепцию доказательства, подобную этой, я буду счастлив. Спасибо.