2014-06-19 4 views
1

J'ai eu du mal à trouver comment mapper ces données JSON à un objet géré dans les données de base en utilisant RestKit 0.23.1 pour les derniers jours. Mes données contient plusieurs « objets », dont chacun a sa propre liste d'un ou plusieurs « liens » qui sont des objets structurés contenant des informations de prévisualisation pour les URL:RestKit 0.23.1 le mappage de relations un à plusieurs ne fonctionne pas

objects": [ 

{ 
    "id": "03fbbec709d261c87a64d979fe1e530b", 
    "object_type": "note", 
    "links": [ 
    { 
     "id": "d48066cf6daa007e31f8915831f46fc2", 
     "urlSite": "techcrunch.com", 
     "siteName": null, 
     "urlString": "http://techcrunch.com/2014/06/16/secret-finally-lets-all-your-freaky-friends-have-their-own-feed/", 
     "urlShortened": "http://gcq.me/1vzsVJY", 
     "title": "Secret Finally Lets All Your Freaky Friends Have Their Own Feeds | TechCrunch", 
     "previewImage": "http://tctechcrunch2011.files.wordpress.com/2014/06/secret2.jpg?w=650", 
     "previewText": "Secret Finally Lets All Your Freaky Friends Have Their Own Feeds | TechCrunch", 
     "lastUpdated": "2014-06-17 06:50:56", 
     "lastVisited": "2014-06-17 06:50:56", 
     "visitCount": 0 
    } 

    ] 
}] 

J'ai créé des fonctions pour aider à construire ma cartographie relations:

+ (RKEntityMapping*)webLinkMapping { 
RKManagedObjectStore* managedObjectStore = [RKManagedObjectStore defaultStore]; 
RKEntityMapping *mapping = [RKEntityMapping mappingForEntityForName:@"WebLink" inManagedObjectStore:managedObjectStore]; 

mapping.identificationAttributes = @[ @"objectId" ]; 
[mapping addAttributeMappingsFromDictionary:@{@"id": @"objectId"}]; 

[mapping addAttributeMappingsFromArray:@[ @"urlSite", @"siteName", @"urlString", @"urlShortened", 
              @"title", @"previewImage", @"previewText", @"lastUpdated", 
              @"lastVisited", @"visitCount"]]; 

return mapping; 
} 

+ (RKEntityMapping*)streamObjectMapping { 
RKManagedObjectStore* managedObjectStore = [RKManagedObjectStore defaultStore]; 
RKEntityMapping *mapping = [RKEntityMapping mappingForEntityForName:@"StreamObject" inManagedObjectStore:managedObjectStore]; 
mapping.identificationAttributes = @[ @"objectId" ]; 

[mapping addAttributeMappingsFromDictionary:@{ 
    @"id":      @"objectId", 
}]; 
[mapping addAttributeMappingsFromArray:@[ @"object_type"]]; 

[mapping addRelationshipMappingWithSourceKeyPath:@"links" mapping:[self webLinkMapping]]; 
//[mapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"links" toKeyPath:@"links" withMapping:[self webLinkMapping]]]; 

return mapping; 
} 

Je suis presque certain que c'est la paire de crochets autour du réseau de liens étant retourné dans le JSON qui est à l'origine de mes correspondances de ne pas travailler à droite. Je continue de recevoir des défauts de la relation dans mes objets de flux retournés:

links = "<relationship fault: 0x114a05820 'links'>"; 

En regardant les tableaux de données réelles à l'aide d'un navigateur sqlite, je vois mes liens objets sont stockés avec la objectId associée correcte de l'objet parent, donc ils ne sont simplement pas retournés correctement quand je demande mon objet de flux. Des pensées sur comment je corrige ceci?

En ce qui concerne le chargement en mémoire, il ne semble pas le faire:

RKStreamObject* postObject = [_postObjects objectAtIndex:indexPath.row]; 

NSLog(@"Links: %@", postObject.links); 


2014-06-20 11:25:11.249 MyApp[6026:151920] Links: Relationship 'links' fault on managed object (0x110c47ee0) <RKStreamObject: 0x110c47ee0> (entity: StreamObject; id: 0xd000000001000000 <x-coredata://F96BC470-82A5-4C56-81A9-71C6129F967B/StreamObject/p64> ; data: { 
body = "http://techcrunch.com/2014/06/16/secret-finally-lets-all-your-freaky-friends-have-their-own-feed/"; 
"comment_count" = 0; 
controllerSource = nil; 
"gc_updated" = "2014-06-20 16:25:10 +0000"; 
"liked_by_me" = 0; 
likes = 0; 
links = "<relationship fault: 0x1141bce40 'links'>"; 
objectId = 03fbbec709d261c87a64d979fe1e530b; 
"object_type" = note; 
photo = nil; 
"photo_feed" = nil; 
"photo_height" = 0; 
"photo_width" = 0; 
place = "0xd000000000100002 <x-coredata://F96BC470-82A5-4C56-81A9-71C6129F967B/Place/p4>"; 
privacy = F; 
"subscribed_by_me" = 1; 
timestamp = "2014-06-17T06:51:00-05:00"; 
"timestamp_as_words" = "3 days ago"; 
"timestamp_formatted" = "Tuesday, June 17, 2014 at 06:51:00 CDT"; 
"timestamp_unix" = 1403005860; 
user = "0xd0000000000c0004 <x-coredata://F96BC470-82A5-4C56-81A9-71C6129F967B/User/p3>"; 
videoId = nil; 
videoSource = nil; 
}) 

Remarquez comment « lieu » et « utilisateur » apparaissent ok? Ce sont des mappages d'objets 1-à-1 qui fonctionnent bien. Les liens ne devraient-ils pas apparaître quand je les appelle directement comme dans la déclaration NSLog?

Édition finale, selon la suggestion de Wain, j'ai extrait le premier objet du tableau de la relation et il renvoie le lien web correspondant.

if ([postObject.links count] > 0) { 
    RKWebLink *link = [[postObject.links allObjects] objectAtIndex:0]; 
    NSLog(@"Link title: %@", link.title); 
} 

Répondre

0
links = "<relationship fault: 0x114a05820 'links'>"; 

Cela ne signifie pas que le contenu de la relation n'existe pas, cela signifie simplement qu'il n'a pas été chargé dans la mémoire encore (ce qui est une faute). Lorsque vous essayez d'utiliser le contenu de la relation, il sera chargé.

Votre code semble correct. Les crochets signifient simplement que vous avez un tableau/une liste d'objets au lieu d'un et n'est pas un problème (c'est une bonne chose).

+0

Basé sur d'autres discussions similaires et cette même réponse, je serais d'accord avec vous, sauf que quand j'accède à la variable de liens, je reçois toujours la même faute. J'ai ajouté plus d'informations à la publication pour montrer comment j'essaie d'accéder aux liens. – webguyatwork

+0

Extrayez le premier élément de la relation et connectez-le. Les défauts sont tirés avec parcimonie afin de ne pas déclencher et charger les données autant que possible. – Wain

+0

Vous, monsieur, êtes un sauveteur! Je n'aurais jamais (enfin, peut-être éventuellement) pensé à essayer ça. C'est exactement ce dont j'avais besoin. Je vous remercie!! – webguyatwork

Questions connexes