2013-09-21 10 views
8

के साथ रीस्टकिट रिलेशनशिप मैपिंग मुझे जेएसओएन प्रतिक्रिया में केवल प्राथमिक कुंजी है और नई ऑब्जेक्ट बनाने के लिए पूरी तरह से नेस्टेड सरणी नहीं है, तो मुझे मैपिंग रिश्तों में परेशानी हो रही है।प्राथमिक कुंजी

मेरे पास 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'' 

क्या मैं चूक मिल सकता है?

उत्तर

5

आपको आइटम में एक क्षणिक विशेषता जोड़ने की आवश्यकता है (shopId कहा जाता है) और एक संबंधित मैपिंग।

कॉन्फ़िगर संबंधों के रूप में विदेशी कुंजी मानचित्रण का उपयोग:

NSEntityDescription *itemEntity = [NSEntityDescription entityForName:@"Item" inManagedObjectContext:managedObjectContext]; 
NSRelationshipDescription *shopRelationship = [itemEntity relationshipsByName][@"shop"]; 
RKConnectionDescription *connection = [[RKConnectionDescription alloc] initWithRelationship:shopRelationship attributes:@{ @"shopId": @"id" }]; 

फिर अपने मानचित्रण में जोड़ने के लिए addConnection: का उपयोग करें।

+0

धन्यवाद @Wain। क्या कोड का यह स्निपेट ऐप प्रतिनिधि या दृश्य नियंत्रक में जाएगा? एंडी – Andy

+0

इसे 'itemMapping' में जोड़ें जहां आपने पहले रिलेशनशिप मैपिंग जोड़ने की कोशिश की थी (लेकिन नेस्टेड आइटम के लिए)। – Wain

+0

मुझे अपवाद मिल रहा है - संपादन देखें। क्या ऐसा इसलिए है क्योंकि मैंने आइटम पर क्षणिक विशेषता नहीं बनाई है? यदि हां, तो कैसे? एंडी – Andy

संबंधित मुद्दे