После прочтения 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
...