Как мне связать объекты Core Data для использования с RestKit?

У меня есть два элемента Core Data (Client и UserFile), которые я успешно установил между ними.

Я создал классы для обоих объектов и сделал их подклассами RKManagedObject.

Когда я создаю новый UserFile, я хочу правильно связать его с Client. Вот что я делаю:

Client *client = [Client objectWithPrimaryKeyValue:@"1"];
UserFile *file = [UserFile object];
file.client = client;
file.clientId = client.clientId;
[[RKObjectManager sharedManager] postObject:file delegate:self];

Кажется, что мне нужно назначить file.clientId, чтобы на сервер был отправлен правильный параметр (если я только назначил file.client, то отправленный client_id пуст).

Кажется, мне нужно назначить file.client, чтобы предотвратить создание нового, пустого Client и связанного с ним файла (требуется отношение клиента).

Это правильно? Должен ли я действительно назначать как внешний ключ, так и фактический объект? Это кажется немного лишним для меня, но я с удовольствием признаю, что мне не хватает знаний Core Data и RestKit!

Ответ 1

Чтобы ответить на ваш вопрос, похоже, что вам нужно выполнить оба действия на данный момент. Здесь код из RKDiscussionBoardExample включен в библиотеку:

DBTopic* topic = [[DBTopic findFirstByAttribute:@"topicID" withValue:topicID] retain];
_post = [[DBPost object] retain];
_post.topicID = topic.topicID;
_post.topic = topic;

Таким образом, либо отношения не настроены должным образом в примере, либо вам действительно нужны оба этапа.

Кроме того, вы должны использовать новейшую версию RestKit, которая имеет другой объект mapper и обесценивает RKManagedObject. Ваши отношения должны выглядеть примерно так:

RKManagedObjectMapping* clientMapping = [RKManagedObjectMapping mappingForClass: [Client class]];
clientMapping.primaryKeyAttribute = @"clientID";
[clientMapping mapKeyPathsToAttributes:
@"id", @"clientID",
nil];

RKManagedObjectMapping* userFileMapping = [RKManagedObjectMapping mappingForClass:[UserFile class]];
userFileMapping.primaryKeyAttribute = @"userFileID";
[userFileMapping mapKeyPathsToAttributes:
 @"id", @"userFileID",
 @"client_id", @"clientID",
 nil];

[userFileMapping mapRelationship:@"client" withObjectMapping:clientMapping];