iPhone: как управлять отношениями Core Data с помощью внешних ключей - PullRequest
1 голос
/ 01 июня 2011

У меня есть приложение, работающее с базами данных как на стороне сервера, так и на стороне клиента iOS.И я использую службы HTTP для синхронизации между SQL Server на стороне сервера и Базовыми данными на iPhone.

У меня есть несколько объектов Базовых данных, таких как:

ProductGroup
Attributes:
id
Relationships:
products

Product
Attributes:
id
productGroupId
Releationships:
productGroup

Из-за ограничениясервер, я не могу использовать инкрементную синхронизацию.Когда я синхронизирую свои данные (например), я должен удалить все объекты ProductGroup, получить ответ от сервера, а затем создать новые (и некоторые старые снова).

Проблема в том, что если у меня productA принадлежит productGroupB, обычно я могу сделать productA.productGroup, но после того, как я удалю productGroupB и создам еще один с тем же содержанием, связь будетпотерян.

Так что я брожу, есть ли какой-нибудь способ управления отношениями с помощью FK, например Entity Framework в .NET, так что я могу все еще найти объект на другом конце отношений после повторного создания.

1 Ответ

1 голос
/ 01 июня 2011

Вы теряете связь при удалении объектов ProductGroup, потому что Базовые данные не являются SQLВ случае отношений, Core Data не заботится об атрибутах объекта на другой стороне отношения, он просто нацелен на конкретный объект.Вы можете иметь произвольное количество объектов с одинаковыми атрибутами, но разные отношения и объекты будут совершенно разными.Отношение Core Data - это не соединение или ключ SQL, а постоянная ссылка в виде указателя на конкретный управляемый объект.Удалите объект, и указатель также должен уйти.

Чтобы выполнить то, что вы хотите, вы можете использовать извлеченное свойство, которое будет извлекать атрибут Product.id динамически.Однако это довольно неуклюжий способ ведения дел.В этом случае вам не нужно прибегать к извлеченному свойству.

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

Звучит так, как будто вы получаете большой объем данных в формате SQL с сервера и думаете, что вам нужно построить граф объектов с нуля.Вы действительно не должны этого делать.В любом случае вам необходимо проанализировать данные для создания новых ProductGroup объектов, поэтому вы должны использовать результаты этого анализа для изменения существующих ProductGroup объектов.

В псевдокоде это будет выглядеть так:

Add a "synced" flag to ProductGroup entity in the data model

Set "synced" of every ProductGroup object to "false"
Extract data for a ProductGroup from server glob
Using data fetch for an existing ProductGroup object
If extracted data matches and existing ProductGroup object
  update existing ProductGroup object
  set synced of ProductGroup object to true
else
  create new ProductGroup object with data
  set synced of new ProductGroup object to true
Delete all ProductGroup objects where synced == false

Здесь важно помнить, что вы имеете дело с объектами, а не с таблицами, столбцами, строками или объединениями.Специалисты по SQL часто предполагают, что Core Data - это просто оболочка объекта вокруг SQL.Это не.Это менеджер графов объектов, который может или не может использовать SQL далеко за кулисами, чтобы сохранить (заморозить) граф объектов на диск.

Вы должны всегда думать об объектах.Интуиция, разработанная вами для работы с SQL, скорее сбивает вас с толку, чем помогает с базовыми данными.

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