Как я должен связывать сущности Core Data для использования с RestKit? - PullRequest
11 голосов
/ 26 мая 2011

У меня есть две сущности базовых данных (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 и его привязку к файлу (требуется связь с клиентом).

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

1 Ответ

9 голосов
/ 04 июля 2011

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

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

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

Кроме того, вы должны использовать новейшую версию RestKit, которая имеет другой сопоставитель объектов и не поддерживает 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];
...