Хранение составного шаблона (дерева) в CoreData с помощью Restkit

Я создал составной объект (древовидную структуру) в Visual Studio и хранится в базе данных сервера SQL с. Вот скриншоты: теперь я хочу создать схему этой модели в основных данных и сохранить полученные данные с помощью RestKi.

вот что я разработал с Xcode:

Может ли кто-нибудь помочь мне сохранить эти данные с помощью RestKit, который я получаю в json?

//Initialize managed object store
.
.
.

//Complete Core Data stack initialization
.
.
.

RKEntityMapping *menuMapping = [RKEntityMapping mappingForEntityForName:@"Menu" inManagedObjectStore:managedObjectStore];
    menuMapping.identificationAttributes = @[@"menuComponentID"];
    [menuMapping addAttributeMappingsFromDictionary:@{
                                                     @"ID":@"menuComponentID",
                                                     @"Name":@"name",
                                                     @"Description":@"descriptions",
                                                     @"Thumbnail":@"thumbnail",
                                                     @"Image": @"image",

                                                     }];

    RKEntityMapping *menuItemMapping = [RKEntityMapping mappingForEntityForName:@"MenuItem" inManagedObjectStore:managedObjectStore];
    [menuItemMapping addAttributeMappingsFromDictionary:@{
                                                          @"ID" : @"menuComponentID",
                                                          @"Description" : @"descriptions",
                                                          @"Name" : @"name",
                                                          @"Thumbnail":@"thumbnail",
                                                          @"Image":@"image",
                                                          @"Calorie":@"calorie",
                                                          @"Vegeterian":@"vegeterian",
                                                         }];
    RKRelationshipMapping *menuRelationShip = [RKRelationshipMapping relationshipMappingFromKeyPath:@"MenuComponents" toKeyPath:@"children" withMapping:menuMapping];
    [menuMapping addPropertyMapping:menuRelationShip];

    RKResponseDescriptor *menuResponseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:menuMapping
                                                                                                method:RKRequestMethodGET
                                                                                           pathPattern:@"/api/menu/"
                                                                                               keyPath:nil
                                                                                           statusCodes:[NSIndexSet indexSetWithIndex:200]];
    [objectManager addResponseDescriptor:menuResponseDescriptor];

управляемые объекты: menuComponnet.h

@class MenuComponent;

@interface MenuComponent : NSManagedObject

@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) NSString * descriptions;
@property (nonatomic, retain) NSString * image;
@property (nonatomic, retain) NSString * thumbnail;
@property (nonatomic, retain) NSString * menuComponentID;
@property (nonatomic, retain) MenuComponent *parent;

@end

////

menu.h

@class MenuComponent;

@interface Menu : MenuComponent

@property (nonatomic, retain) NSSet *children;
@end

@interface Menu (CoreDataGeneratedAccessors)

- (void)addChildrenObject:(MenuComponent *)value;
- (void)removeChildrenObject:(MenuComponent *)value;
- (void)addChildren:(NSSet *)values;
- (void)removeChildren:(NSSet *)values;

@end

menuItem.h

@interface MenuItem : MenuComponent

@property (nonatomic, retain) NSNumber * price;
@property (nonatomic, retain) NSNumber * calorie;
@property (nonatomic, retain) NSNumber * vegeterian;

@end

когда я просматриваю созданную базу данных sqlite. Я вижу, что существует только одно имя созданной таблицы menuComponent который имеет все атрибуты всего меню и и menuItem. в то время как nhibernate bas создал для меня три таблицы, как вы видите на картинке выше. и родительское поле для всех записей равно нулю!!

как я могу успешно сохранить эти данные? пожалуйста, объясни. Я новичок в RestKit.

По умолчанию JSON я получил:

[{"ID":"213028b8-9f59-4d7f-bae9-a2c301815a43","MenuComponents":[{"ID":"d1a861d3-d9e8-41a4-9577-a2c301815a44","MenuComponents":[{"ID":"fa6d172d-ab26-4782-8306-a2c301815a44","Vegetarian":false,"Calorie":0,"Name":"Double Chocolate Cake","Description":"With a melted heart of chocolate","Parent":{"ID":"d1a861d3-d9e8-41a4-9577-a2c301815a44"},"Version":"AAAAAAAAF64="},{"ID":"f9050f6b-8419-4457-9ebd-a2c301815a44","Vegetarian":false,"Calorie":0,"Name":"Tiramisu","Description":"Lady finger cookies are soaked in coffee liqueur and rum","Parent":{"ID":"d1a861d3-d9e8-41a4-9577-a2c301815a44"},"Version":"AAAAAAAAF60="}],"Name":"Dessets Menu","Description":"Desserts for serving after meal","Parent":{"ID":"213028b8-9f59-4d7f-bae9-a2c301815a43"},"Version":"AAAAAAAAF6o="},{"ID":"1f50565a-eeb2-4ab0-ba7b-a2c301815a44","MenuComponents":[{"ID":"0352c5a2-081a-496d-86aa-a2c301815a44","Vegetarian":true,"Calorie":0,"Name":"Grilled Chicken Salad","Description":"Sliced, grilled chicken tops a fresh salad mix, peas","Parent":{"ID":"1f50565a-eeb2-4ab0-ba7b-a2c301815a44"},"Version":"AAAAAAAAF6w="},{"ID":"4fad8aa0-285f-4419-b85e-a2c301815a44","Vegetarian":true,"Calorie":0,"Name":"Carolina Chicken Salad","Description":"Salad mix, fried chicken tenders, peas, cheddar cheese","Parent":{"ID":"1f50565a-eeb2-4ab0-ba7b-a2c301815a44"},"Version":"AAAAAAAAF6s="}],"Name":"Salad & Combinations","Description":"Salad & Combinations","Parent":{"ID":"213028b8-9f59-4d7f-bae9-a2c301815a43"},"Version":"AAAAAAAAF6k="}],"Name":"Lunch Menu","Description":"Lunch Super Menu","Version":"AAAAAAAAF6E="},{"ID":"fa6d172d-ab26-4782-8306-a2c301815a44"},{"ID":"0352c5a2-081a-496d-86aa-a2c301815a44"},{"ID":"d1a861d3-d9e8-41a4-9577-a2c301815a44"},{"ID":"f9050f6b-8419-4457-9ebd-a2c301815a44"},{"ID":"4fad8aa0-285f-4419-b85e-a2c301815a44"},{"ID":"1f50565a-eeb2-4ab0-ba7b-a2c301815a44"}]

Вы можете просмотреть JSON здесь:

http://jsonviewer.stack.hu/

ОБНОВИТЬ:

вот менюкомпонент RelationShip

RKRelationshipMapping *menuComponentRelationShip = [RKRelationshipMapping relationshipMappingFromKeyPath:@"MenuComponents" toKeyPath:@"children" withMapping:menuComponentMapping];

[menuComponentMapping addPropertyMapping: menuComponentRelationShip];

но я должен сопоставить menuItem тоже, потому что некоторые свойства предназначены исключительно для menuItem.

  RKEntityMapping *menuItemMapping = [RKEntityMapping mappingForEntityForName:@"MenuItem" inManagedObjectStore:managedObjectStore];
    [menuItemMapping addAttributeMappingsFromDictionary:@{
                                                          @"ID" : @"menuComponentID",
                                                          @"Description" : @"descriptions",
                                                          @"Name" : @"name",
                                                          @"Thumbnail":@"thumbnail",
                                                          @"Image":@"image",
                                                          @"Prcie":@"price",
                                                          @"Calorie":@"calorie",
                                                          @"Vegeterian":@"vegeterian",
                                                         }];
RKResponseDescriptor *menuItemresponseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:menuItemMapping
                                                                                                    method:RKRequestMethodGET
                                                                                               pathPattern:@"/api/menu/"
                                                                                                   keyPath:nil
                                                                                               statusCodes:[NSIndexSet indexSetWithIndex:200]];

[objectManager addResponseDescriptor:menuItemresponseDescriptor];

но после добавления этого responseDescriptor в mobjetManager добавляется только одно суперменю!! Как я могу сопоставить menuItem и добавить их в базу данных тоже?

1 ответ

Решение

Похоже, что ваша проблема вообще не связана с RestKit, скорее это неправильное понимание основных данных.

  1. Ваши дочерние отношения должны быть в компоненте меню и обратны родительским отношениям. Это позволяет Core Data правильно управлять отношениями (и, как вы ожидаете).
  2. У вас должна быть только 1 таблица в файле БД SQLite, потому что вы используете наследование сущностей (это не проблема, просто детали реализации).

Так что просто поменяйте отношения в модели и вам будет хорошо идти.

Другие вопросы по тегам