Отношения сопоставления объектов RestKit без KVC - PullRequest
8 голосов
/ 17 февраля 2012

После прочтения Object Mapping-Guide на GitHub для RestKit моя проблема не исчезла, поэтому, возможно, кто-нибудь скажет, может ли RestKit справиться со следующей идеей.

Сущности с отношениями

 Company 
 - unitID 
 - companyID
 - name
 - contacts* (Company -->> Contact | 1:n)

 Contact
 - unitID
 - companyID
 - contactID
 - lastName
 - firstName
 - account* (Contact >--> Company | 1:1)

JSON (Компания)

 [
   {
      "unitID":"003CABD8DEB5DC13C",
      "companyID":"BSP-002999",
      "name":"Testcompany"
   }
 ]

JSON (Контакт)

 [
   {
      "unitID":"DAC2ACCC125795D00",
      "companyID":"BSP-002999",
      "contactID":"CLP-015468",
      "firstName":"Mister",
      "lastName":"Wayne"
   }
 ]

Из-за ограничений я не могу вложить принадлежащие контакты в компании (иначе я бы не стал писать это), поэтому я хочу использовать это при отображении данных при импорте.

Вопрос

Можно ли сопоставить каждый контакт с принадлежащей ему компанией (идентифицируемой атрибутом companyID ) при импорте с помощью заданных методов RestKit?

Если нет, я хотел бы узнать лучшее решение для этого. Спасибо!


Фон

В моей первой сборке этого приложения я сопоставил объекты с заданными объектами (без отношений) и извлек все принадлежащие контакты компании с предикатом companyID =% @ . Из-за объема данных (4000+ компаний, 7000+ контактов) выборка всех принадлежащих контактов занимает около секунды - поэтому мне пришла в голову идея использовать отношения (которая отлично работает с локальными фиктивными данными).


Решение

С помощью приведенного ниже ответа мое текущее отображение выглядит следующим образом (RestKit v.10).

// Setting up Restkit with objectStore
...

// Init objectMapping for Class Company
companyMapping = [RKManagedObjectMapping mappingForClass:[Company class] inManagedObjectStore:objectStore];
[companyMapping mapKeyPath:@"unitID" toAttribute:@"unitID"];
[companyMapping mapKeyPath:@"companyID" toAttribute:@"companyID"];
[companyMapping mapKeyPath:@"name" toAttribute:@"name"];
companyMapping.setDefaultValueForMissingAttributes = NO;
companyMapping.primaryKeyAttribute = @"companyID";

// Init objectMapping for Class Contact
contactMapping = [RKManagedObjectMapping mappingForClass:[Contact class] inManagedObjectStore:objectStore];
[contactMapping mapKeyPath:@"unitID" toAttribute:@"unitID"];
[contactMapping mapKeyPath:@"companyID" toAttribute:@"companyID"];
[contactMapping mapKeyPath:@"contactID" toAttribute:@"contactID"];
[contactMapping mapKeyPath:@"lastName" toAttribute:@"lastName"];
[contactMapping mapKeyPath:@"firstName" toAttribute:@"firstName"];
contactMapping.setDefaultValueForMissingAttributes = NO;
contactMapping.primaryKeyAttribute = @"contactID";

// Init relationships
[contactMapping mapRelationship:@"company" withMapping:companyMapping];
[contactMapping connectRelationship:@"company" withObjectForPrimaryKeyAttribute:@"companyID"];

// Get objects from server
...

1 Ответ

12 голосов
/ 17 февраля 2012

Да, RestKit может гидрировать эти отношения для вас во время картирования.В вашем RKManagedObjectMapping для вашей модели контактов вам нужно будет сделать следующее:

  • Добавить сопоставление отношений в родительскую компанию: [objectMapping mapRelationship:@"company" withMapping:companyMapping]
  • Сопоставить атрибут companyID с вашим контактоммодель
  • Убедитесь, что у вас настроен атрибут primaryKeyAttribute для обоих классов
  • . Поручите RestKit увлажнять отношения: [objectMapping connectRelationship:@"company" withObjectForPrimaryKeyAttribute:@"companyID"];

После того, как RestKit завершит сопоставление полезной нагрузки,это пройдет через коллекцию и увлажнит любые отношения.Обработка откладывается до отображения после того, как полезная нагрузка фактически создает объекты, необходимые для удовлетворения соединений.

В ветви разработки доступен альтернативный рабочий процесс.Ранее на этой неделе я добавил поддержку гидратации отношения «есть много» с использованием массива идентификаторов в полезной нагрузке.Это позволит вам отправить список контактов, принадлежащих компании, в полезную нагрузку.Это может быть более эффективным для вашего случая использования.

Дополнительные сведения из моего поста в список рассылки RestKit: http://groups.google.com/group/restkit/msg/416951f86b2862d1

...