使用2个类将对象映射到Core Data

时间:2014-09-25 21:08:13

标签: ios objective-c core-data restkit

所以这是我第一次尝试将对象映射到CoreData,我认为我做对了,但我没有什么问题。首先,我只是不知道我是否以正确的方式映射它,第二个是我获得了成功响应但没有映射对象。

我有2个对象DbRestError& DbRestCategory。 DbRestError包含来自服务器的错误,DbRestCategory包含类别本身。两者都是从相同的反应回来,但RestKit似乎无法映射它们。

这些是对象:

DbRestError

@interface DbRestError : NSManagedObject

@property (nonatomic, retain) NSNumber * statusCode;
@property (nonatomic, retain) NSString * errorTitle;

@end

DbRestCategory

@interface DbRestCategory : NSManagedObject

@property (nonatomic, retain) NSString * title;
@property (nonatomic, retain) NSNumber * idNum;

@end

这是我使用RestKit初始化CoreData的方法:

- (void)setup
{
    self.objectStore = [[RKManagedObjectStore alloc] initWithManagedObjectModel:[self managedObjectModel]];

    NSString *path = [RKApplicationDataDirectory() stringByAppendingPathComponent:@"database.sqlite"];
    NSLog(@"Setting up store at %@", path);
    [self.objectStore addSQLitePersistentStoreAtPath:path
                              fromSeedDatabaseAtPath:nil
                                   withConfiguration:nil
                                             options:@{ NSInferMappingModelAutomaticallyOption: @YES, NSMigratePersistentStoresAutomaticallyOption: @YES }
                                               error:nil];

    [self.objectStore createManagedObjectContexts];
}

这是我初始化RestKit客户端的方式:

- (void)initRestClient
{
    NSURL *baseURL = [NSURL URLWithString:kWebServiceBaseURL];
    self.manager = [RKObjectManager managerWithBaseURL:baseURL];
    [self.manager setRequestSerializationMIMEType:RKMIMETypeJSON];
    [self.manager setAcceptHeaderWithMIMEType:RKMIMETypeJSON];
    [self.manager addResponseDescriptorsFromArray:[RKObjectManager sharedManager].responseDescriptors];
    [self.manager addRequestDescriptorsFromArray:[RKObjectManager sharedManager].requestDescriptors];
    [self.manager.HTTPClient.operationQueue setMaxConcurrentOperationCount:MAX_CONCURRENT_OPERATION_COUNT];
    [self.manager setManagedObjectStore:[[MainDb sharedDb] objectStore]];

    [RKObjectManager setSharedManager:self.manager];

    self.requestMethod = RKRequestMethodGET;
    self.statusCode = RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful);

    RKRoute *categoriesRoute = [RKRoute routeWithClass:[DbRestCategory class] pathPattern:kGetCategories method:self.requestMethod];
    categoriesRoute.shouldEscapePath = YES;
    [self.manager.router.routeSet addRoute:categoriesRoute];

    //  @@yosi -- Error Mapping
    //
    //
    RKEntityMapping *errorMapping = [RKEntityMapping mappingForEntityForName:@"DbRestError" inManagedObjectStore:[[MainDb sharedDb] objectStore]];
    [errorMapping addAttributeMappingsFromDictionary:@{ @"statusCode" : @"statusCode", @"description" : @"errorTitle" }];

    //  @@yosi -- Categories Mapping
    //
    //
    RKEntityMapping *categoryMapping = [RKEntityMapping mappingForEntityForName:@"DbRestCategory" inManagedObjectStore:[[MainDb sharedDb] objectStore]];
    [categoryMapping addAttributeMappingsFromDictionary:@{ @"id" : @"idNum", @"name" : @"title" }];

    RKObjectMapping *categoriesMapping = [RKObjectMapping mappingForClass:[RestCategories class]];
    [categoriesMapping addRelationshipMappingWithSourceKeyPath:@"categories" mapping:categoryMapping];
    [categoriesMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"error" toKeyPath:@"error" withMapping:errorMapping]];

    [[RKObjectManager sharedManager] addResponseDescriptor:[RKResponseDescriptor responseDescriptorWithMapping:categoriesMapping
                                                                                                        method:self.requestMethod
                                                                                                   pathPattern:kGetCategories
                                                                                                       keyPath:nil
                                                                                                   statusCodes:self.statusCode]];
}

这就是我自己处理请求的方式:

[[RKObjectManager sharedManager] getObject:[[DbRestCategory alloc] init] path:nil parameters:nil success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {

} failure:^(RKObjectRequestOperation *operation, NSError *error) {

}];

这就是JSON的样子:

{
error: {
statusCode: 10,
description: "success"
},
categories: [
    {
        id: "3",
    name: "cate 3"
    },
    {
        id: "4",
    name: "cate 4"
    },
    {
        id: "5",
    name: "cate 5"
    },
    {
        id: "1",
    name: "cate 1"
    },
    {
        id: "6",
    name: "cate 6"
    },
    {
        id: "2",
    name: "cate 2"
    }
             ]
}

有人可以帮助我理解为什么我会在没有任何对象的情况下得到答复吗?

1 个答案:

答案 0 :(得分:0)

尝试像这样的请求映射,

// Request Mapping

// Map error
RKEntityMapping *errorMapping = [RKEntityMapping mappingForEntityForName:@"DbRestError" inManagedObjectStore:[[MainDb sharedDb] objectStore]];
[errorMapping addAttributeMappingsFromDictionary:@{ @"statusCode" : @"statusCode", @"description" : @"errorTitle" }];
[[RKObjectManager sharedManager] addResponseDescriptor:[RKResponseDescriptor responseDescriptorWithMapping:errorMapping method:self.requestMethod pathPattern:kGetCategories keyPath:@"error" statusCodes:self.statusCode]];

// Map Category
RKEntityMapping *categoryMapping = [RKEntityMapping mappingForEntityForName:@"DbRestCategory" inManagedObjectStore:[[MainDb sharedDb] objectStore]];
[categoryMapping addAttributeMappingsFromDictionary:@{ @"id" : @"idNum", @"name" : @"title" }];

[[RKObjectManager sharedManager] addResponseDescriptor:[RKResponseDescriptor responseDescriptorWithMapping:categoriesMapping method:self.requestMethod pathPattern:kGetCategories keyPath:@"categories" statusCodes:self.statusCode]];
相关问题