Pregunta

Estoy teniendo algunas dificultades con la Publicación de un NSManagedObject con anidada NSManagedObjects con RestKit.Me parece estar recibiendo registros duplicados para la sub-NSManagedObjects inserta en CoreData cuando el POST devuelve.Aquí está una foto de la modelo:

Model

Aquí está el JSON que estoy Publicando:

{
  "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
}

Aquí está el JSON que devuelve el servicio después de que el 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
}

EDITAR (supongo que esto es importante):Aquí está la asignación para el WTSImage y 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]];

El siguiente código es donde creo que la NSManagedObjects y llame a [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];
    }];

Cuando el éxito de bloque se invoca, reviso la base de datos sqlite y hay 1 WTSRecord insertado y 2 WTSImages.Uno de los WTSImages tiene la correcta FK a la WTSRecord y el PK de la base de datos, mientras que la otra parece ser huérfano (dbId y el FK a WTSRecord no están establecidos).

Aquí hay un enlace a la RestKit y los Datos principales de los registros de seguimiento: https://dl.dropboxusercontent.com/u/466390/restkit2.txt

Espero que alguien pueda ayudar!Gracias!

EDITAR Después de algo más de buscar, me encontré con esta página: https://github.com/RestKit/RestKit/issues/1228

¿Tengo que crear una identificación de los elementos en el lado del cliente usando los Uuid antes de la Publicación de los mismos a un servicio REST?Se RestKit no ser capaz de asignar objetos de solicitud volver a objetos que ya fueron creados en el almacén de objetos sin establecer primero una identificación de atributos en el lado del cliente?

¿Fue útil?

Solución

Para la publicación de objeto, RestKit entiende cómo actualizar el artículo con los datos de respuesta, pero que no se aplica a la relación de contenidos.Técnicamente podría ser codificado, pero no lo es en la actualidad.

Si usted necesita el objeto en la relación después de la asignación para el mismo objeto que se crea, entonces usted tiene un problema.Si no te importa ser un objeto diferente, a continuación, el tema es solo para eliminar el duplicado...

Eliminación de duplicados:

Recuperación solicitud bloques no son usados en la producción de un POST de respuesta por lo que se necesita para recuperar la víctima y eliminarlo manualmente.Voy a asumir que cualquier imagen con una nula relación a un registro es un dupe de modo que es relativamente sencillo capturar a ejecutar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top