Сопоставление NSManagedObject Entity с пользовательским классом с помощью RestKit - PullRequest
1 голос
/ 11 декабря 2011

Я могу получить результаты JSON и сопоставить их с БД. Однако, как только я пытаюсь сопоставить сущность с моим подклассом, моё отображение прерывается.

JSON Sample:
{"Customers":[{"Customer":{"Active":"Y","BranchID":0,"CustomerID":"SMCJIMB00736253","CustomerIdentifier":"","CustomerTypeID":0,"Name":""}}]}

Setup:
// Initialize RestKit
RKObjectManager* objectManager = [RKObjectManager objectManagerWithBaseURL:TEST_SERVICES_ROOT];

// Initialize object store
objectManager.objectStore = [RKManagedObjectStore objectStoreWithStoreFilename:RKDefaultSeedDatabaseFileName];

Mapping:
RKManagedObjectMapping* customerMapping = [RKManagedObjectMapping mappingForClass:[Customer class]];
customerMapping.primaryKeyAttribute = @"customerID";
[customerMapping mapKeyPathsToAttributes:@"Active", @"active", nil];
[customerMapping mapKeyPathsToAttributes:@"BranchID", @"branchID", nil];
[customerMapping mapKeyPathsToAttributes:@"CustomerID", @"customerID", nil];
[customerMapping mapKeyPathsToAttributes:@"CustomerIdentifier", @"customerIdentifier", nil];
[customerMapping mapKeyPathsToAttributes:@"CustomerTypeID", @"customerTypeID", nil];
[customerMapping mapKeyPathsToAttributes:@"Name", @"name", nil];

Add Mapping:
[objectManager.mappingProvider setMapping:customerMapping forKeyPath:@"Customers.Customer"];

Call WS:
// Load the object model via RestKit    
RKObjectManager* objectManager = [RKObjectManager sharedManager];
NSString *url = [NSString stringWithFormat:SERVICE_CUSTOMERS,@"0",@"1",@"100"];
[objectManager loadObjectsAtResourcePath:url delegate:self block:^(RKObjectLoader* loader) {
    loader.objectMapping = [objectManager.mappingProvider objectMappingForClass:[Customer class]];
}];

@interface Customer : NSManagedObject

@property (nonatomic, retain) NSString* active;
@property (nonatomic, retain) NSNumber* branchID;
@property (nonatomic, retain) NSString* customerID;
@property (nonatomic, retain) NSString* customerIdentifier;
@property (nonatomic, retain) NSNumber* customerTypeID;
@property (nonatomic, retain) NSString* name;

//populated via fetch predicate
@property (nonatomic, retain) NSArray* customerAddress;

@end

@implementation Customer

@dynamic active;
@dynamic branchID;
@dynamic customerID;
@dynamic customerIdentifier;
@dynamic customerTypeID;
@dynamic name;

//populated via fetch predicate
@dynamic customerAddress;

@end

Это прекрасно работает, пока я не пытаюсь сопоставить класс Customer с сущностью в модели данных. В конечном итоге я пытаюсь использовать свой класс Customer в качестве MKAnnotation, но не могу, поскольку не могу предоставить конкретный класс реализации. Я уверен, что в этом есть какое-то недопонимание RestKit. Я вижу, что RKTwitterCoreData имеет RKStatus в качестве конкретного подкласса.

@ конец

1 Ответ

0 голосов
/ 02 января 2012

Хорошо, Я понял это после долгих проб и ошибок! Проблема заключалась в том, что мне нужно было установить rootKeyPath в моем отображении так, чтобы он совпадал с rootkeyPath, который я использую при добавлении сопоставления в поставщик сопоставлений. Клиент RKTwitterCoreData этого не делает, но мне нужно было по какой-то причине.

    RKManagedObjectMapping* userMapping = [RKManagedObjectMapping mappingForClass:[User class]];
    userMapping.rootKeyPath = @"User";
    userMapping.primaryKeyAttribute = @"userName";
    [userMapping mapKeyPathsToAttributes:@"Authenticated", @"authenticated", nil];

    ................
    [objectManager.mappingProvider setMapping:userMapping forKeyPath:@"User"];
...