Restkit комплексное сопоставление объектов с вложенными массивами объектов в Core Data

#iphone #objective-c #core-data #restkit

#iPhone #objective-c #core-data #restkit

Вопрос:

я использую coredata и restkit для сопоставления данных.

вот ответ json для вызова getsales

 {   "success":true,
"sales" : [
            {
        "brands" :[
        {"id":"637", "name":"XYZ"},
        {"id":"638", "name":"abc"}
        ]
        "end_date" = "2011-10-14 12:00:00",
        "id" = 3794,
        "image" = "http://dummy.something.com.jpg",
        "name" = "test",
    },
       {
       "brands" =[
        {"id":"640", "name":"abc"}
        ],
        "end_date" = "2011-10-14 12:00:00",
        "id" = 3766,
        "image" = "http://dummy.something.com.jpg",
        "name" = "text2",
    },
       {
       "brands" =[
        {"id":"641", "name":"XYZ"},
        {"id":"642", "name":"abc"},
        {"id":"643", "name":"def"}
        ],
        "end_date" = "2011-11-06 12:00:00",
        "id" = 3798,
        "image" = "http://dummy.something.com.jpg",
        "name" = "test3",
    }
]
}
  

у меня есть

 @interface Sale : NSManagedObject{   
}
@property (nonatomic, retain) NSNumber * ID;
@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) NSDate * endDate;
@property (nonatomic, retain) NSString * imageUrl;

@implementation Sale

@dynamic ID;
@dynamic name;
@dynamic startDate;
@dynamic endDate;
@dynamic imageUrl;
  

Я пытаюсь отобразить ответ следующим образом

 - (void)getSales{
    RKObjectManager* objectManager = [RKObjectManager     objectManagerWithBaseURL:@"http://baseurl.com"];
    RKManagedObjectStore* objectStore = [RKManagedObjectStore     objectStoreWithStoreFilename:@"base.sqlite"];
objectManager.objectStore = objectStore;


RKManagedObjectMapping* saleMapping = [RKManagedObjectMapping mappingForClass:[Sale class]];
    [saleMapping mapKeyPathsToAttributes:
     @"id", @"ID",
     @"name", @"name",
     @"start_date",@"startDate",
     @"end_date", @"endDate",
     @"image", @"imageUrl",
     nil];

    saleMapping.primaryKeyAttribute = @"ID";
    [[RKObjectManager sharedManager].mappingProvider setMapping:saleMapping forKeyPath:@"sales"];

[[RKObjectManager sharedManager] loadObjectsAtResourcePath:@"/getSales/" objectMapping:saleMapping delegate:self];
}
  

по сути, у меня есть вложенные массивы объектов, каков правильный способ сопоставления этих объектов??
и какой тип свойства должен иметь класс Sale для хранения списка брендов??

Любая помощь приветствуется, я уже потратил слишком много времени на исправление этого.

Ответ №1:

Попробуйте добавить:

[saleMapping mapKeyPath:@"brands" toRelationship:@"brands" withMapping:[BrandObject objectMapping]];

где [BrandObject objectMapping] находится сопоставление для BrandObject (NSManagedObject со id name свойствами и).

По сути, вы можете использовать mapKeyPath:toRelationship:withMapping: для вложенных сопоставлений. Вам также потребуется добавить свойство к вашему объекту продажи с типом NSSet :

@property (nonatomic, retain) NSSet *brands;

Наконец, в реализации объекта Sale добавьте: @dynamic brands наряду с другими операторами @dynamic .

Надеюсь, это поможет! Спасибо.

Комментарии:

1. Можете ли вы (или кто-либо другой) объяснить последний шаг «Добавить динамическое свойство к вашему объекту продажи с именем NSSet * brands» чуть более подробно? Вот где я зависаю.

2. Я обновил более подробную информацию о свойстве NSSet. Спасибо!