Question

Je vais avoir quelques difficultés de Poster une NSManagedObject avec imbriqué NSManagedObjects avec RestKit.Je semble être d'obtenir des enregistrements en double pour la sous-NSManagedObjects inséré dans CoreData lorsque le POST renvoie.Voici un aperçu du modèle:

Model

Voici le JSON que j'ai écris:

{
  "actions": [], 
  "application": "Identify", 
  "createBy": "welcomed", 
  "createDt": "2014-04-11T16:26:15Z", 
  "description": null, 
  "externalId": null, 
  "groupId": "5", 
  "id": 0, 
  "images": [
    {
      "format": "JPEG", 
      "height": 200, 
      "id": 0, 
      "image": "/9j/4A..../Pv5n/9k=", 
      "status": "C", 
      "type": "MUGSHOT", 
      "width": 200
    }
  ], 
  "locked": null, 
  "modifyBy": null, 
  "modifyDt": null, 
  "priv": null
}

Voici le JSON renvoyé par le service après le POST:

{
"actions": [], 
  "application": "Identify", 
  "createBy": "welcomed", 
  "createDt": 1397233575000, 
  "description": null, 
  "externalId": null, 
  "groupId": "5", 
  "id": 11, 
  "images": [
    {
      "captureDevice": null, 
      "createBy": null, 
      "createDt": null, 
      "format": "JPEG", 
      "height": 200, 
      "id": 11, 
      "image": "/9j/4AAQSkZJR.../Pv5n/9k=", 
      "recordId": 11, 
      "status": "C", 
      "type": "MUGSHOT", 
      "width": 200
    }
  ], 
  "locked": false, 
  "modifyBy": null, 
  "modifyDt": null, 
  "priv": false
}

EDIT (je suppose que c'est important):Voici la cartographie pour la WTSImage et WTSRecord:

RKEntityMapping *recordMapping = [RKEntityMapping mappingForEntityForName:@"WTSRecord" inManagedObjectStore:self.managedObjectStore];
    [recordMapping addAttributeMappingsFromDictionary:@{
                                                        @"id":@"dbId",
                                                        @"externalId":@"extId",
                                                        @"groupId":@"groupId",
                                                        @"application": @"application",
                                                        @"description": @"desc",
                                                        @"priv": @"priv",
                                                        @"locked": @"locked",
                                                        @"createBy": @"createBy",
                                                        @"createDt": @"createDt",
                                                        @"modifyBy": @"modifyBy",
                                                        @"modifyDt": @"modifyDt",
                                                        }];
    recordMapping.identificationAttributes = @[@"dbId"];

    //image mapping
    RKEntityMapping *imageMapping = [RKEntityMapping mappingForEntityForName:@"WTSImage" inManagedObjectStore:self.managedObjectStore];
    [imageMapping addAttributeMappingsFromDictionary:@{
                                                       @"id": @"dbId",
                                                       @"status": @"status",
                                                       @"type": @"type",
                                                       @"format": @"format",
                                                       @"width": @"width",
                                                       @"height": @"height",
                                                       @"image": @"base64Image"
                                                       }];

    imageMapping.identificationAttributes = @[@"dbId"];
    [recordMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"images" toKeyPath:@"images" withMapping:imageMapping]];

Le code suivant est là que j'ai créer le NSManagedObjects et appel [RKObjectManager postObject:path:parameters:success:failure::

WTSRecord *record = [NSEntityDescription insertNewObjectForEntityForName:@"WTSRecord" inManagedObjectContext:self.managedObjectContext];
record.createBy = @"welcomed";
record.createDt = [NSDate date];
record.application = kWTSApplicationIdentify;
record.groupId = @"5";

WTSImage *image = [NSEntityDescription insertNewObjectForEntityForName:@"WTSImage" inManagedObjectContext:self.managedObjectContext];
image.height = [NSNumber numberWithFloat:mugshot.size.height];
image.width = [NSNumber numberWithFloat:mugshot.size.width];
image.imageData = UIImageJPEGRepresentation(imageData, 1.0);
image.type = kWTSCaptureTypeMugshot;
image.format = kWTSCaptureFormatJpeg;
image.status = kWTSCaptureStatusCaptured;

image.record = record;
[record addImagesObject:image];

RKObjectManager *manager = [RKObjectManager sharedManager];
[manager postObject:record path:@"records" parameters:nil success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {

    } failure:^(RKObjectRequestOperation *operation, NSError *error) {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error Sending Record" message:error.localizedDescription delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [alert show];
    }];

Lorsque la réussite est invoquée, je vérifie la base de données sqlite et il y a 1 WTSRecord inséré et 2 WTSImages.L'un des WTSImages a la bonne FK à la WTSRecord et le PK à partir de la base de données, tandis que l'autre semble être orphelin (dbId et de la FK à WTSRecord ne sont pas définies).

Voici un lien vers le RestKit et de la Base de Données des journaux de trace: https://dl.dropboxusercontent.com/u/466390/restkit2.txt

J'espère que quelqu'un pourra vous aider!Merci!

MODIFIER Après quelques recherche, j'ai trouvé cette page: https://github.com/RestKit/RestKit/issues/1228

Dois-je créer des éléments d'identification sur le côté client à l'aide des Uuid avant de Poster à un service REST?Va RestKit ne pas être en mesure de mapper des objets de demande de retour à des objets qui ont déjà été créés dans le magasin d'objets sans en définir au préalable une identification de l'attribut sur le côté client?

Était-ce utile?

La solution

Pour le posté objet, RestKit comprend comment la mise à jour de cet élément avec les données de réponse, mais qui ne s'applique pas à la relation de contenu.Techniquement, il pourrait être codé, mais elle n'est pas actuellement.

Si vous avez besoin de l'objet dans la relation après la mise en correspondance le même objet que vous créez alors vous avez un problème.Si vous n'avez pas l'esprit étant un objet différent, alors la question est juste de supprimer le doublon...

Double suppression:

Demande de récupération de blocs ne sont pas utilisés lors du traitement d'un POSTE de réponse, de sorte que vous aurez besoin de chercher la dupe et le supprimer manuellement.Je vais supposer que n'importe quelle image avec un nul relation est un dupe de sorte qu'il est relativement simple de chercher à exécuter.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top