Domanda

Sto avendo difficoltà a pubblicare un nsmmangedobject con Nsmmangedobjects nidificati con Restkit. Sembra che ottenga record duplicati per i sub-nsmangedobjects inseriti in CoreData quando il post ritorna. Ecco un'istantanea del modello:

modello

Ecco il JSON che sto 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
}
.

Ecco il JSON che viene restituito dal servizio dopo il 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
}
.

Modifica (Suppongo che questo sia importante): Ecco la mappatura per il wtsimage e il 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]];
.

Il seguente codice è dove creo NsManageDobjects e Chiama [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 viene invocato il blocco di successo, controllo il database SQLite e vi è 1 WTSRecord inserito e 2 WtSimages. Uno dei Wtsimages ha il corretto FK al WTSRECOD e il PK dal database, mentre l'altro sembra essere orfano (DBID e il FK a WTSRECOD non è impostato).

Ecco un link per i registri di Restkit e Core Data Trace: https:// dl.dropboxuseertent.com/u/466390/restkit2.txt

Speriamo che qualcuno possa aiutare! Grazie!

Modifica Dopo un po 'di ricerca, ho trovato questa pagina: https : //github.com/restkit/restkit/issues/1228

Devo creare elementi di identificazione sul lato client utilizzando UUIDs prima di pubblicarli in un servizio di riposo? Restkit non è in grado di mappare gli oggetti di richiesta Torna agli oggetti già creati nell'archivio oggetti senza prima impostazione di un attributo di identificazione sul lato client?

È stato utile?

Soluzione

Per l'oggetto pubblicato, Restkit comprende come aggiornare tale voce con i dati di risposta, ma ciò non si applica ai contenuti della relazione.Tecnicamente potrebbe essere codificato, ma non è al momento.

Se è necessario l'oggetto nella relazione dopo la mappatura per essere lo stesso oggetto che si crea allora hai un problema.Se non ti dispiace essere un oggetto diverso, il problema è solo per eliminare il duplicato ...

Delezione duplicata:

I blocchi di recupero di recupero non vengono utilizzati durante l'elaborazione di una risposta post, quindi è necessario recuperare il DUPE ed eliminarlo manualmente.Ho intenzione di presumere che qualsiasi immagine con una relazione NIL con un record sia un duple, quindi è un recupero relativamente semplice da eseguire.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top