Pergunta

Eu estou tendo algumas dificuldades para Postar um NSManagedObject com aninhados NSManagedObjects com RestKit.Eu parecer estar ficando registros duplicados para o sub-NSManagedObjects inserido em CoreData quando a POSTAGEM de retorno.Aqui é um instantâneo do modelo:

Model

Aqui é o JSON que estou Postando:

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

Aqui é o JSON que é retornado o serviço após o 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 (suponho que isso é importante):Aqui é o mapeamento para a WTSImage e 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]];

O código a seguir é onde eu criar o NSManagedObjects e chamada de [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];
    }];

Quando o sucesso do bloco é chamado, verificar o banco de dados sqlite e há 1 WTSRecord inserido e 2 WTSImages.Um dos WTSImages correto FK para o WTSRecord e o PK do banco de dados, enquanto o outro parece ser órfão (dbId e o FK para WTSRecord não estão definidos).

Aqui está um link para o RestKit e os principais Dados de logs de rastreamento: https://dl.dropboxusercontent.com/u/466390/restkit2.txt

Espero que alguém possa ajudar!Obrigado!

EDITAR Depois de mais algumas pesquisas, eu encontrei esta página: https://github.com/RestKit/RestKit/issues/1228

Tenho para criar elementos de identificação no lado do cliente usando Uuid antes de publicá-los para um serviço REST?Vai RestKit não ser capaz de mapear objetos de solicitação de volta para objetos que já foram criados no armazenamento de objetos sem primeiro definir um atributo de identificação no lado do cliente?

Foi útil?

Solução

Para o objeto postado, o RESTKIT entende como atualizar esse item com os dados de resposta, mas isso não se aplica ao conteúdo do relacionamento.Tecnicamente poderia ser codificado, mas não é atualmente.

Se você precisar do objeto no relacionamento após o mapeamento para ser o mesmo objeto que você cria, então você tem um problema.Se você não se importa, é um objeto diferente, então o problema é apenas para excluir a duplicata ...

Declização duplicada:

Bloqueio de solicitação de busca não é usado ao processar uma resposta de postagem para que você precise buscar o Dupe e excluí-lo manualmente.Eu vou assumir que qualquer imagem com um relacionamento nulo com um registro é um Dupe, então é uma busca relativamente simples executar.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top