Основные данные множественные отношения к одному и тому же объекту - PullRequest
5 голосов
/ 11 сентября 2011

Я довольно много изучал Core Data, и теперь я решил, что пришло время использовать их в новом проекте, который я делаю.

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

Я делаю приложение, основанное на определении местоположения, и я хотел бы сохранить «поездки» в своей модели базовых данных, поэтому для каждой поездки у меня есть некоторая традиционная информация, такая как дата, расстояние, описание и т. Д. Но мне также нужно чтобы сохранить информацию о местоположении, которая мне понадобится, чтобы нанести несколько точек на карту.

Итак, у меня есть объект «до» и «от» за поездку, я создал объект MapPoint с атрибутами широты, долготы и имени местоположения. В моей сущности Trip я добавил отношения "to" и "from", назначение которых - MapPoint.

Но что мне делать с обратным свойством?

Поскольку Xcode, похоже, выдает предупреждение, я оставляю его как "Нет обратного".

Мне нужно было создать 2 взаимосвязи в MapPoint для ссылки на Trip до «to» и еще одну взаимосвязь, ссылающуюся на «from» Trip.

Это правильно? Я не совсем понимаю.

У меня похожая проблема с сущностью пользователя, когда она используется в нескольких других сущностях. Должен ли я реализовать обратную связь с каждой сущностью, которая использует пользователя?

Чтобы Xcode был доволен, мне кажется, мне нужно создать отношения с пользователем обратно в Trip и обратно к другим сущностям, которые я использую, таким как объекты Upload, Picture и т. Д. ... мне кажется неприятным думать о Trip имеет объект User, который затем подготовил бы ссылку на Upload / Photo ..., которая не имеет никакого отношения к этой поездке.

Ответы [ 3 ]

6 голосов
/ 11 сентября 2011

Если вы хотите поддерживать обратные отношения для ваших отношений to и from, вы можете просто добавить соответствующие отношения к вашей сущности MapPoint. Назовите их tripTo и tripFrom, или как вам кажется более подходящим, и установите их как обратные отношения для ваших отношений to и from соответственно.

Как объясняют документы, вам не нужно моделировать отношения в обоих направлениях, но это облегчает жизнь. Что происходит, например, когда пользователь удаляется? Если у вас есть ряд других объектов, связанных с пользователем, то вам нужен какой-то способ выяснить, какие объекты были связаны с этим пользователем, чтобы вы могли их обновить. Если у вас есть обратные отношения, Core Data может автоматически обновлять любые связанные объекты, используя выбранное вами правило удаления (например, nullify). Без обратных связей вам решать все связанные объекты.

3 голосов
/ 12 сентября 2011

По моему опыту, Core Data не "требует", чтобы у вас были обратные отношения, но их отсутствие приводит к таинственным ошибкам, даже , если , вы убедитесь, что ваш объектный граф согласован вручную.По крайней мере, я думаю, что именно это и привело к таинственным ошибкам.

Хранилище SQLite использует обратные отношения для представления отношений ко многим.Для отношения foo ко многим от сущности A к сущности B я бы подумал, что это создаст отдельную таблицу "foo" со столбцом A и столбцом B, а идентификаторы объектов будут появляться в столбце A. более одного раза. Нет.Он вообще не представляет отношения один-ко-многим, он представляет только их инверсии, которые являются отношениями один-ко-одному.Он представляет fooInverse как столбец в таблице сущности B, содержащий идентификаторы объектов, которые соответствуют сущностям A-типа.Таким образом, вы должны иметь обратное.Кажется, что в простых случаях Core Data может определить, какой должна быть инверсия, если вы ее не определили, и ваше свойство to-many работает правильно.Однако в более сложных случаях, таких как описанный вами, он падает.

2 голосов
/ 11 сентября 2011

Я не совсем знаком с Базовыми Данными, но я полагаю, что у них есть форма наследования сущностей.

Вы можете сделать вашу MapPoint сущность абстрактной и создать FromMapPoint и ToMapPointкоторые наследуют свои атрибуты от сущности MapPoint.

Ваша сущность Trip может затем иметь два отдельных отношения - одно к FromMapPoint и одно к ToMapPoint с соответствующими инверсиями.

Как я уже сказал - я не эксперт по CD, так что, надеюсь, кто-то еще может прийти и проверить / отклонить это предложение?

Немного покопавшись, я обнаружил, что вы можете установить родительский объект черезИнспектор моделей данных.Я создал это быстрое представление того, о чем вы говорили.

...