2011-12-07 3 views
2

J'ai la structure JSON suivante:JSON RKManagedObjectMapping avec RestKit

{ 
    "users": 
    [ 
    { 
     "user_id":"000228D2-CB0D-4019-ADF9-66FE163E0BBC", 
     "firstname":"aFirstname", 
     "name":"aLastName", 
     "nickname":"user_nickname", 
     "email":"user_email", 
     "uri":"user_website", 
     "birthday":"1976-12-08 00:00:00", 
     "password":"49722f17a3838181cc9cf351df9d9054e465a778", 
     "recovery_key":"97011336-3A4C", 
     "language":"fr_FR", 
     "timezone":"Europe\/Paris", 
     "last_update":"0000-00-00 00:00:00", 
     "creation_date":"2011-11-24 15:03:50", 
     "status":"20" 
    } 
    , 
    { 
     "user_id":"100228D2-CB0D-4019-ADF9-66FE163E0BBC", 
     "firstname":"aFirstname", 
     "name":"aLastName", 
     "nickname":"user_nickname", 
     "email":"user_email", 
     "uri":"user_website", 
     "birthday":"1976-12-08 00:00:00", 
     "password":"49722f17a3838181cc9cf351df9d9054e465a778", 
     "recovery_key":"97011336-3A4C", 
     "language":"fr_FR", 
     "timezone":"Europe\/Paris", 
     "last_update":"0000-00-00 00:00:00", 
     "creation_date":"2011-11-24 15:03:50", 
     "status":"10" 
    } 
    ] 
} 

Alors j'ai le code suivant dans mon application iPhone pour gérer les objets et données JSON de base.

ObjectManager INIT:

RKObjectManager* objectManager = [RKObjectManager objectManagerWithBaseURL:@"http://json_source_url.com"]; 
objectManager.client.requestQueue.showsNetworkActivityIndicatorWhenBusy = YES; 
NSString *databaseName = @"myDatastore.sqlite"; 
objectManager.objectStore = [RKManagedObjectStore objectStoreWithStoreFilename:databaseName usingSeedDatabaseName:nil managedObjectModel:nil delegate:self]; 

configuration de la cartographie de l'objet:

RKManagedObjectMapping* userMapping = [RKManagedObjectMapping mappingForEntityWithName:@"User"]; 
userMapping.primaryKeyAttribute = @"userID"; 
[userMapping mapKeyPathsToAttributes:@"user_id", @"userID", 
@"firstname", @"firstname", 
@"name", @"name", 
@"nickname", @"nickname", 
@"email", @"email", 
@"uri", @"uri", 
@"birthday", @"birthday", 
@"password", @"password", 
@"recovery_key", @"recoveryKey", 
@"language", @"language", 
@"timezone", @"timezone", 
@"last_update", @"lastUpdate", 
@"creation_date", @"creationDate", 
@"status", @"status", 
nil]; 
[objectManager.mappingProvider setMapping:userMapping forKeyPath:@"users"]; 

Avec cette configuration, il ne fonctionne pas. ObjectLoader ne crée ou ne met pas à jour quoi que ce soit dans le magasin de données coreData.

Si je change la structure JSON avec ce qui suit, cela fonctionne comme un charme.

[ 
    { 
    "user_id":"000228D2-CB0D-4019-ADF9-66FE163E0BBC", 
    "firstname":"aFirstname", 
    "name":"aLastName", 
    "nickname":"user_nickname", 
    "email":"user_email", 
    "uri":"user_website", 
    "birthday":"1976-12-08 00:00:00", 
    "password":"49722f17a3838181cc9cf351df9d9054e465a778", 
    "recovery_key":"97011336-3A4C", 
    "language":"fr_FR", 
    "timezone":"Europe\/Paris", 
    "last_update":"0000-00-00 00:00:00", 
    "creation_date":"2011-11-24 15:03:50", 
    "status":"20" 
    } 
    , 
    { 
    "user_id":"100228D2-CB0D-4019-ADF9-66FE163E0BBC", 
    "firstname":"aFirstname", 
    "name":"aLastName", 
    "nickname":"user_nickname", 
    "email":"user_email", 
    "uri":"user_website", 
    "birthday":"1976-12-08 00:00:00", 
    "password":"49722f17a3838181cc9cf351df9d9054e465a778", 
    "recovery_key":"97011336-3A4C", 
    "language":"fr_FR", 
    "timezone":"Europe\/Paris", 
    "last_update":"0000-00-00 00:00:00", 
    "creation_date":"2011-11-24 15:03:50", 
    "status":"10" 
    } 
] 

Merci pour votre aide

+0

Alors, quelle est votre question? On dirait que vous l'avez fait fonctionner. – jadarnel27

+0

Cela fonctionne mais pas avec la structure json que je veux utiliser. Le premier que je mentionne avec { "utilisateurs": [ { – Appsido

Répondre

0

Regardez:

RKObjectMapping* usersMapping = [RKObjectMapping mappingForClass:[MyClassForUserObjects class]]; 

et

[[RKObjectManager sharedManager].mappingProvider setMapping:statusMapping forKeyPath:@"users"]; 
+0

Je veux utiliser RKManagedObjectMapping depuis que je suis un lien avec CoreData. Cela ne marche pas mieux d'ailleurs – Appsido

2

En fait, je l'ai enfin trouvé la solution. Il s'agit simplement de déclarer que votre mappage d'objet est à l'intérieur d'une balise spécifique de la réponse json. Dans mon cas "utilisateurs" en ajoutant la ligne suivante

userMapping.rootKeyPath = @ "users";

Espérons que cela aide les autres.


    RKManagedObjectMapping* userMapping = [RKManagedObjectMapping mappingForEntityWithName:@"User"]; 
    userMapping.primaryKeyAttribute = @"userID"; 
    userMapping.rootKeyPath = @"users"; 
    [userMapping mapKeyPathsToAttributes:@"user_id", @"userID", 
    @"firstname", @"firstname", 
    @"name", @"name", 
    @"nickname", @"nickname", 
    @"email", @"email", 
    @"uri", @"uri", 
    @"birthday", @"birthday", 
    @"password", @"password", 
    @"recovery_key", @"recoveryKey", 
    @"language", @"language", 
    @"timezone", @"timezone", 
    @"last_update", @"lastUpdate", 
    @"creation_date", @"creationDate", 
    @"status", @"status", 
    nil]; 
    [objectManager.mappingProvider setMapping:userMapping forKeyPath:@"users"];