Restkit Pubblicazione di oggetti gestiti nidificati crea duplicati
-
21-12-2019 - |
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:
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?
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.