#ios #objective-c #core-data #restkit #restkit-0.20
#iOS #objective-c #core-данные #restkit #restkit-0.20
Вопрос:
Проблема в том, что мне нужно полностью удалить атрибут @»unitprice» из полезной нагрузки, когда значение равно нулю, но сохранить его там, если оно имеет значение в запросе. Таким образом, полезная нагрузка для строки заказа будет выглядеть следующим образом соответственно: @{«id»: @»orderlineId», @»unitprice»: @»unitprice»} ИЛИ @{«id»: @»orderlineId»} Обратите внимание, что сопоставление представляет собой отношение «один ко многим». Возможно ли это сделать? Ваша помощь действительно ценится, спасибо! /* requestDescriptor */
(RKObjectMapping*) getSalesOrderMapping:(RKRequestMethod)method {
RKEntityMapping *requestMapping = [RKEntityMapping mappingForEntityForName:@"SalesOrder"
inManagedObjectStore:[RKManagedObjectStore defaultStore]];
RKEntityMapping *orderLinesMapping = [RKEntityMapping mappingForEntityForName:@"OrderLine"
inManagedObjectStore:[RKManagedObjectStore defaultStore]];
requestMapping.identificationAttributes = @[ @"salesOrderId" ];
NSMutableDictionary *attributeMappings = [NSMutableDictionary dictionaryWithDictionary:@{
@"id": @"salesOrderId",
}];
NSDictionary *orderLineAttributeMappings = @{
@"id": @"orderlineId",
@"unitprice": @"unitPrice"
};
[orderLinesMapping addAttributeMappingsFromDictionary:orderLineAttributeMappings];
[requestMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"lines"
toKeyPath:@"salesOrderToOrderLines"
withMapping:orderLinesMapping]];
return requestMapping;
}
Комментарии:
1. Вы хотите сказать, что
unitprice
это отношение 1: много? Показать содержимое OrderLine.h
Ответ №1:
Установите assignsDefaultValueForMissingAttributes
значение для NO
сопоставления. Вам не нужны 2 разных сопоставления (если вы не хотите включить nil
в JSON некоторые атрибуты).
Комментарии:
1. Я обновил свой вопрос, поскольку assignsDefaultValueForMissingAttributes не исключает атрибут ‘unitprice’ из JSON, когда он равен нулю, и включает его, когда он имеет значение. Проблема в нашем API, когда ‘unitprice’ не был изменен, мы должны исключить его из сопоставления JSON, поэтому мы присваиваем nil ‘unitprice’, а затем мы хотим написать некоторую логику для RestKit, чтобы исключить значения nil из сопоставления JSON. Итак, я думаю, что это возможно только при использовании динамического сопоставления, я прав? Спасибо
2. Установка
assignsDefaultValueForMissingAttributes
значенияNO
должна исключать nil из отображаемого результата, вы пробовали и видели иначе? Покажите этот тестовый код.3. Я добавил эти две строки responseMapping.assignsDefaultValueForMissingAttributes = НЕТ; orderLinesMapping.assignsDefaultValueForMissingAttributes = НЕТ; странно, не повезло, он исключает не сопоставленные атрибуты, но поскольку сопоставляется ‘unitprice’, он сохраняет его со значением nil. В любом случае спасибо.
4. Вы делаете запрос, поэтому применяете его к обратному отображению, которое вы принимаете.
5. к сожалению, проблема в том, что мне нужно полностью удалить атрибут из полезной нагрузки, когда значение равно нулю, но сохранить его там, если оно имеет значение в запросе. Таким образом, полезная нагрузка будет выглядеть следующим образом соответственно: @{«id»: @»orderlineId», @»unitprice»: @»unitprice»} ИЛИ @{«id»: @»orderlineId»} Обратите внимание, что сопоставление представляет собой отношение «один ко многим». Возможно ли это сделать? Ваша помощь действительно ценится, спасибо!
Ответ №2:
Кажется невозможным реализовать динамический дескриптор запроса с отношением «1 ко многим». Поэтому мне пришлось вручную создать NSMutableDictionary, проверив значение nil, а затем добавить свойства с его значениями, например, следующим образом
[objectManager postObject:nil
path:@"/salesorder"
parameters:[self customSalesOrderRequestMapping]
success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {... }
- (NSMutableDictionary *) customSalesOrderRequestMapping {
customSalesOrderAttributeDictionary = [NSMutableDictionary new];
if (selectedSalesOrder.salesOrderId) [customSalesOrderAttributeDictionary addEntriesFromDictionary:@{@"id": selectedSalesOrder.salesOrderId}];
if (selectedSalesOrder.salesOrderToOrderLines.count > 0) {
NSMutableArray *orderLinesMutableArray = [NSMutableArray new];
for (OrderLine *orderLine in selectedSalesOrder.salesOrderToOrderLines)
{
NSMutableDictionary *orderLineMutableDictionary = [NSMutableDictionary new];
if (orderLine.orderlineId) [orderLineMutableDictionary addEntriesFromDictionary:@{@"id": orderLine.orderlineId}];
if (orderLine.unitPrice) [orderLineMutableDictionary addEntriesFromDictionary:@{@"unitprice": orderLine.unitPrice}];
[orderLinesMutableArray addObject:orderLineMutableDictionary];
}
[customSalesOrderAttributeDictionary addEntriesFromDictionary:@{@"lines": orderLinesMutableArray}];
}
return customSalesOrderAttributeDictionary;
}