RestKit публикует Вложенные Управляемые объекты, создавая дубликаты

StackOverflow https://stackoverflow.com//questions/23018541

Вопрос

У меня возникли некоторые трудности с публикацией NSManagedObject с вложенными NSManagedObjects с помощью RestKit.Кажется, я получаю дублирующиеся записи для вспомогательных объектов NSManagedObjects, вставленных в CoreData, когда возвращается POST.Вот снимок модели:

Model

Вот JSON, который я публикую:

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

Вот JSON, который возвращается из сервиса после отправки сообщения:

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

РЕДАКТИРОВАТЬ (я полагаю, это важно):Вот сопоставление для WTSImage и 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]];

В следующем коде я создаю NSManagedObjects и вызываю [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];
    }];

Когда вызывается блок успеха, я проверяю базу данных sqlite, и там вставлен 1 WTSRecord и 2 Изображения.Один из WTSImages имеет правильный FK для WTSRecord и PK из базы данных, в то время как другой, похоже, потерян (dbId и FK для WTSRecord не заданы).

Вот ссылка на журналы трассировки RestKit и Core Data: https://dl.dropboxusercontent.com/u/466390/restkit2.txt

Надеюсь, кто-нибудь сможет помочь!Спасибо!

Редактировать После еще некоторых поисков я нашел эту страницу: https://github.com/RestKit/RestKit/issues/1228

Должен ли я создавать идентификационные элементы на стороне клиента, используя UUID, прежде чем отправлять их в службу REST?Сможет ли RestKit сопоставлять объекты запроса обратно с объектами, которые уже были созданы в хранилище объектов, без предварительной установки атрибута идентификации на стороне клиента?

Это было полезно?

Решение

Для опубликованного объекта RestKit понимает, как обновить этот элемент данными ответа, но это не относится к содержимому связи.Технически это могло бы быть закодировано, но в настоящее время это не так.

Если вам нужно, чтобы объект в связи после сопоставления был тем же объектом, который вы создаете, тогда у вас проблема.Если вы не возражаете, что это другой объект, то проблема заключается просто в удалении дубликата...

Удаление дубликатов:

Блоки запроса выборки не используются при обработке ответа POST, поэтому вам нужно будет извлечь дубликат и удалить его вручную.Я собираюсь предположить, что любое изображение с нулевым отношением к записи является обманом, поэтому выполнить его относительно просто.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top