Frage

Ich habe einige Schwierigkeiten beim POSTEN eines NSManagedObject mit verschachtelten NSManagedObjects mit RestKit.Es scheint, dass ich doppelte Datensätze für die untergeordneten NSManagedObjects erhalte, die in CoreData eingefügt werden, wenn der POST zurückkehrt.Hier ist ein Schnappschuss des Modells:

Model

Hier ist der JSON, den ich poste:

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

Hier ist der JSON-Code, der nach dem POST vom Dienst zurückgegeben wird:

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

EDIT (ich denke, das ist wichtig):Hier ist die Zuordnung für WTSImage und 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]];

Im folgenden Code erstelle ich die NSManagedObjects und rufe sie auf [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];
    }];

Wenn der Erfolgsblock aufgerufen wird, überprüfe ich die SQLite-Datenbank und es ist 1 WTSRecord eingefügt und 2 WTSImages.Eines der WTSImages hat den richtigen FK für WTSRecord und den PK aus der Datenbank, während das andere verwaist zu sein scheint (dbId und der FK für WTSRecord sind nicht festgelegt).

Hier ist ein Link zu den RestKit- und Core Data-Trace-Protokollen: https://dl.dropboxusercontent.com/u/466390/restkit2.txt

Hoffentlich kann jemand helfen!Danke!

BEARBEITEN Nach einigem Suchen bin ich auf diese Seite gestoßen: https://github.com/RestKit/RestKit/issues/1228

Muss ich auf der Clientseite Identifizierungselemente mithilfe von UUIDs erstellen, bevor ich sie an einen REST-Dienst poste?Wird RestKit nicht in der Lage sein, Anforderungsobjekte wieder Objekten zuzuordnen, die bereits im Objektspeicher erstellt wurden, ohne zuvor ein Identifikationsattribut auf der Clientseite festzulegen?

War es hilfreich?

Lösung

Für das gepostete Objekt versteht RestKit, wie dieses Element mit den Antwortdaten aktualisiert wird, aber das gilt nicht für den Beziehungsinhalt.Technisch könnte es codiert werden, ist es aber derzeit nicht.

Wenn das Objekt in der Beziehung nach der Zuordnung dasselbe Objekt sein muss, das Sie erstellt haben, liegt ein Problem vor.Wenn es Ihnen nichts ausmacht, dass es sich um ein anderes Objekt handelt, besteht das Problem lediglich darin, das Duplikat zu löschen ...

Doppelte Löschung:

Abrufanforderungsblöcke werden bei der Verarbeitung einer POST-Antwort nicht verwendet, daher müssten Sie das Dupe abrufen und manuell löschen.Ich gehe davon aus, dass jedes Bild mit einer Null-Beziehung zu einem Datensatz ein Duplikat ist, sodass der Abruf relativ einfach auszuführen ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top