के साथ रीस्टकिट रिलेशनशिप मैपिंग मुझे जेएसओएन प्रतिक्रिया में केवल प्राथमिक कुंजी है और नई ऑब्जेक्ट बनाने के लिए पूरी तरह से नेस्टेड सरणी नहीं है, तो मुझे मैपिंग रिश्तों में परेशानी हो रही है।प्राथमिक कुंजी
मेरे पास 2 कक्षाएं हैं - दुकान और वस्तु, और जैसा कि आप उम्मीद करेंगे कि दुकान-> आइटम में एक से अधिक रिश्ते हैं।
मेरे पास दुकानों (और आइटम) की स्थानीय कोर-डेटा स्टोर है, प्रत्येक प्राथमिक कुंजी के साथ। मैं फिर जेएसओएन के रूप में आइटम्स की एक सूची डाउनलोड करना चाहता हूं और कोर-डेटा इकाइयों को मानचित्र बनाना चाहता हूं, लेकिन केवल दुकान की प्राथमिक कुंजी शामिल है, न कि सभी दुकानों के विवरण को नेस्टेड सरणी के रूप में - यह नेटवर्क ट्रैफिक का बड़ा अपशिष्ट होगा। 500+ आइटम के विवरण डाउनलोड कर रहा हूँ।
/दुकानों
{
"id" : 1,
"shop" : "Shop A",
"city" : "New York"
},
{
"id" : 2,
"shop" : "Shop B",
"city" : "London"
},
...
/ आइटम
{
"id" : 1,
"name" : "Shoes",
"manufacturer" : "Vans",
"shopId" : 1
},
{
"id" : 2,
"name" : "T-shirt",
"manufacturer" : "Animal",
"shopId" : 2
},
{
"id" : 3,
"name" : "Scarf",
"manufacturer" : "Ted Baker",
"shopId" : 1
},
{
"id" : 4,
"name" : "Sunglasses",
"manufacturer" : "Ray-Ban",
"shopId" : 3
},
...
यहाँ पल में मेरी कोड है:
यहाँ दो अनुरोधों से JSON है ।
AppDelegate.m
...
NSURL *baseURL = [NSURL URLWithString:@"http://localhost/company/API"];
RKObjectManager *objectManager = [RKObjectManager managerWithBaseURL:baseURL];
[AFNetworkActivityIndicatorManager sharedManager].enabled = YES;
[objectManager.HTTPClient setDefaultHeader:@"Accept" value:@"application/json"];
NSManagedObjectModel *managedObjectModel = [NSManagedObjectModel mergedModelFromBundles:nil];
RKManagedObjectStore *managedObjectStore = [[RKManagedObjectStore alloc] initWithManagedObjectModel:managedObjectModel];
objectManager.managedObjectStore = managedObjectStore;
// Shop Mapping
RKEntityMapping *shopMapping = [RKEntityMapping mappingForEntityForName:NSStringFromClass([Shop class])
inManagedObjectStore:objectManager.managedObjectStore];
NSDictionary *shopMappingAttributes = [NSDictionary dictionaryWithObjectsAndKeys:@"objectId",@"id",@"name",@"shop",@"city",@"city",nil];
shopMapping.identificationAttributes = @[@"objectId"];
[shopMapping addAttributeMappingsFromDictionary:shopMappingAttributes];
[objectManager addResponseDescriptor:[RKResponseDescriptor responseDescriptorWithMapping:shopMapping
pathPattern:@"/shops"
keyPath:nil
statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)]];
// Item Mapping
RKEntityMapping *itemMapping = [RKEntityMapping mappingForEntityForName:NSStringFromClass([Item class])
inManagedObjectStore:objectManager.managedObjectStore];
NSDictionary *itemMappingAttributes = [NSDictionary dictionaryWithObjectsAndKeys:@"objectId",@"id",@"name", @"name",@"manufacturer",@"manufacturer",nil];
itemMapping.identificationAttributes = @[@"objectId"];
[itemMapping addAttributeMappingsFromDictionary:itemMappingAttributes];
// Define the relationship mapping
[objectManager addResponseDescriptor:[RKResponseDescriptor responseDescriptorWithMapping:itemMapping
pathPattern:@"/items"
keyPath:nil
statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)]];
...
ItemsTableViewController.m
- (void)viewDidLoad {
[super viewDidLoad];
// Update Shops
[[RKObjectManager sharedManager] getObjectsAtPath:@"/shops"
parameters:nil
success:nil
failure:^(RKObjectRequestOperation *operation, NSError *error) {
NSLog(@"Error: %@",error);
}];
// Update/Get Items
NSDictionary *parameters = @{
@"username": self.username,
@"password": self.password,
@"API_key": @"abc123",
};
NSMutableURLRequest *request = [[RKObjectManager sharedManager] requestWithObject:nil
method:RKRequestMethodPOST
path:@"/items"
parameters:parameters];
RKManagedObjectRequestOperation *operation = [[RKObjectManager sharedManager] managedObjectRequestOperationWithRequest:request managedObjectContext:[RKManagedObjectStore defaultStore].mainQueueManagedObjectContext
success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
Item *item = [mappingResult firstObject];
NSLog(@"Mapped the Item: %@", item);
} failure:^(RKObjectRequestOperation *operation, NSError *error) {
NSLog(@"Error: %@",error);
}];
NSOperationQueue *operationQueue = [NSOperationQueue new];
[operationQueue addOperation:operation];
}
संपादित करें: वेन, मेरे पास है एप्लिकेशन प्रतिनिधि में प्रासंगिक स्थान पर इस पर एक NSException
NSEntityDescription *itemEntity = [NSEntityDescription entityForName:@"Item" inManagedObjectContext:managedObjectStore.mainQueueManagedObjectContext];
NSRelationshipDescription *shopRelationship = [itemEntity relationshipsByName][@"shop"];
RKConnectionDescription *connection = [[RKConnectionDescription alloc] initWithRelationship:shopRelationship attributes:@{ @"shopId": @"objectId" }];
[itemMapping addConnection:connection];
NSException
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '+entityForName: nil is not a legal NSManagedObjectContext parameter searching for entity name 'Item''
क्या मैं चूक मिल सकता है?
धन्यवाद @Wain। क्या कोड का यह स्निपेट ऐप प्रतिनिधि या दृश्य नियंत्रक में जाएगा? एंडी – Andy
इसे 'itemMapping' में जोड़ें जहां आपने पहले रिलेशनशिप मैपिंग जोड़ने की कोशिश की थी (लेकिन नेस्टेड आइटम के लिए)। – Wain
मुझे अपवाद मिल रहा है - संपादन देखें। क्या ऐसा इसलिए है क्योंकि मैंने आइटम पर क्षणिक विशेषता नहीं बनाई है? यदि हां, तो कैसे? एंडी – Andy