Restkit addConnectionForRelationship борется

У меня две сущности: Contact и Listing. User может пометить конкретный Listing как свой Favourite. Я правильно настроил отношения и могу добавить Listing как Favourite для User.

Проблема для меня - это API. Это дает мне только id отношений: contact_id и listing_id.

Как я могу настроить RestKit для сопоставления отношений, определенных в объекте Favourites, который я получаю с сервера, который дает мне только два объекта ids контакта и листинга?

Версия Restkit: 0.20.3

JSON для избранного:

{
         "contact_id": "1",
         "created_at": "2013-11-06T15:02:21.056Z",
         "id": "2",
         "listing_id": "3",
         "updated_at": "2013-11-06T15:02:21.056Z"
}

JSON для контакта:

{
    "id": 1,
    "favorites": [
        {
             "contact_id": "1",
             "created_at": "2013-11-06T15:02:21.056Z",
             "id": "2",
             "listing_id": "3",
             "updated_at": "2013-11-06T15:02:21.056Z"
        }
    ],
    "first_name": Max, 
}


//////////
// Contact
//////////
RKEntityMapping *contactMapping = [RKEntityMapping mappingForEntityForName:@"PBContact" inManagedObjectStore:managedObjectStore];
contactMapping.identificationAttributes = @[ @"object_id" ];
[contactMapping addAttributeMappingsFromDictionary:@{ @"id": @"object_id" }];
[contactMapping addAttributeMappingsFromArray:@[ @"given_name", @"address", @"birthday",
                                                 @"city", @"company_name", @"country",
                                                 @"email", @"family_name", @"gender",
                                                 @"mobile_number", @"note", @"phone_number",
                                                 @"state", @"zip_code", @"created_at", @"updated_at" ]];


//////////
// Listing
//////////
RKEntityMapping *listingMapping = [RKEntityMapping mappingForEntityForName:@"PBListing" inManagedObjectStore:managedObjectStore];
listingMapping.identificationAttributes = @[ @"object_id" ];
[listingMapping addAttributeMappingsFromDictionary:@{ @"id": @"object_id", @"description": @"descriptions" }];
[listingMapping addAttributeMappingsFromArray:@[ @"address", @"name", @"bathrooms", @"bedrooms",
                                                 @"city", @"country", @"price", @"title",
                                                 @"zip_code", @"latitute", @"longitude", @"status",
                                                 @"total_area", @"year_built", @"property_type", @"listing_type",
                                                 @"size", @"lot_size", @"parking_spaces", @"view",
                                                 @"state", @"note", @"monthly_rent", @"created_at", @"updated_at" ]];


//////////
// Relationships
//////////

[contactMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"favorites" toKeyPath:@"favoriteListings" withMapping:listingMapping]];

[listingMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"favorites" toKeyPath:@"prospects" withMapping:contactMapping]];

Дескриптор ответа

RKResponseDescriptor *contactResponseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:contactMapping
                                                                                        method:RKRequestMethodAny
                                                                                   pathPattern:@"api/v1/contacts"
                                                                                       keyPath:nil
                                                                                   statusCodes:statusCodes];

person Daniel Stooß    schedule 27.11.2013    source источник
comment
Какая версия RestKit? Покажите JSON, который вы получаете, и какие сопоставления вы в настоящее время используете для него.   -  person Wain    schedule 27.11.2013
comment
Всегда ли избранное вложено, когда вы получаете пользователей? Итак, у вас есть только один дескриптор ответа?   -  person Wain    schedule 27.11.2013
comment
Да, избранное всегда вложено. И у меня есть один дескриптор дескриптора ответа   -  person Daniel Stooß    schedule 27.11.2013


Ответы (1)


Вам не нужны (и нужно удалить):

[listingMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"favorites" toKeyPath:@"prospects" withMapping:contactMapping]];

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

Не совсем понятно, почему существует 3 идентификатора:

"contact_id": "1",
"id": "2",
"listing_id": "3",

Я предполагаю, что contact_id всегда соответствует внешнему контакту, в который вложены избранные, и не требуется. И это id - полезная информация (так что ваше отображение верное).

В вашей модели Core Data favoriteListings и prospects должны быть противоположны друг другу.


Основываясь на ваших последних комментариях, я считаю, что вам нужно создать новое и другое сопоставление списков. Это отображение содержит только @"listing_id" : @"object_id". Это либо приведет к ссылке на существующий объект листинга, либо создаст заполнитель, который можно будет заполнить позже. Это отображение, которое вы должны использовать в качестве отношения на contactMapping.

person Wain    schedule 27.11.2013
comment
Идентификатор - это идентификатор любимого объекта, поступающего с сервера. (У меня нет этого объекта в CoreData) И contact_id иisting_id говорят мне, что контакт 1 установил листинг 3 как свой любимый. Таким образом, Restkit должен добавить объявление с идентификатором 3 в список избранных контактов. - person Daniel Stooß; 28.11.2013
comment
Детали объявления поступили из другого запроса? У вас есть листинговые объекты, и вам нужно их связать (отображение внешнего ключа)? - person Wain; 28.11.2013
comment
Я получаю данные о моих контактах через / contacs; подробности о списках через / listings. Я получаю избранные отношения (contact_id иisting_id) либо через вложенный элемент избранного в контакте, либо через / избранное - person Daniel Stooß; 28.11.2013
comment
Работал как шарм. Спасибо Wain! - person Daniel Stooß; 28.11.2013