2014-09-25 2 views
0

객체를 CoreData에 매핑하려고 시도한 것은 이번이 처음입니다. 문제가별로 없지만 몇 가지 문제가 있습니다. 우선, 내가 올바르게 매핑하고 있는지, 두 번째로 성공 응답을 얻었지만 매핑 된 객체가 없는지는 알 수 없습니다.2 개의 클래스로 CoreData에 객체 매핑

2 개체가 있습니다. DbRestError & DbRestCategory. DbRestError는 서버의 오류를 포함하고 DbRestCategory는 범주 자체를 포함합니다. 둘 다 같은 응답에서 돌아 오지만 RestKit은 그들을 매핑 할 수없는 것 같습니다.

:

@interface DbRestCategory : NSManagedObject 

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

@end 

이 내가 RestKit 내 CoreData를 초기화하는 방법입니다 DbRestCategory

DbRestError

@interface DbRestError : NSManagedObject 

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

@end 

:

는 객체

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

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

}]; 

이 어떻게 JSON입니다 :

- (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]]; 
} 

이 내가 요청 자체를하고 있어요 방법은 다음과 같습니다

- (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 클라이언트를 초기화하는 방법입니다 모양 :

{ 
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" 
    } 
      ] 
} 

누군가 어떤 물건도없이 응답을받는 이유를 이해할 수 있습니까?

+0

'error'와'categories'는 동일한 응답을 받고있다,이 같은 요청 매핑을보십시오. 왜 당신은'getObjectsAtPath' 대신'getObject' 메소드를 사용하고 있습니까? 두 엔티티를 매핑하는 두 개의 응답 디스크립터를 추가 할 수 있습니다. –

+0

@AnushaK 그래, 그랬어,하지만 여전히 작동하지 않아. 이제 다음 오류가 표시됩니다. https://groups.google.com/forum/#!topic/restkit/2u5Ke_FnaZU –

답변

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]];