restkit投稿ネストされた管理対象オブジェクトを複製します
-
21-12-2019 - |
質問
ネストされたNSManagedObjectsをrestkitでネストしたNSmanagedObjectsを掲載しているいくつかの困難を持っています。投稿が返されると、CoreDataに挿入されたSub-NSManagedObjectsの重複レコードを取得しているようです。これがモデルのスナップショットです。
これは私が投稿している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
}
.
POSTの後にサービスから返される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があります。 WTSImagesの1つはWTSRecordとデータベースからのPKに正しいFKを持ち、もう1つは孤立しているように見えます(DBIDとFKはWTSRecordには設定されていません)。
これはRestkitおよびCoreデータトレースログへのリンクです。 https:// dl.dropboxusercontent.com/u / 466390/restkit2.txt
誰かが助けることができることをうまくいけば!ありがとう!
編集もう少し検索後、私はこのページを見つけました: HTTPS //github.com/restkit/restkit/issues/1228
UUIDを使用してクライアント側に識別要素を作成する必要がありますか?クライアント側で識別属性を最初に設定せずに、要求オブジェクトをすでにオブジェクトストア内で既に作成されていたオブジェクトにリクエストオブジェクトをマッピングできませんか?
解決
投稿されたオブジェクトの場合、Restkitはその項目を応答データで更新する方法を理解していますが、関係内容には適用されません。技術的にはコーディングすることができますが、現在はそうではありません。
マッピング後の関係にオブジェクトが必要な場合は、作成したものと同じオブジェクトになる場合は問題があります。別のオブジェクトであることを気にしない場合、問題は重複しています...
重複削除:
FETCH要求ブロックは、ポスト応答を処理するときに使用されず、DUPEを取得して手動で削除する必要があります。レコードとのNIL関係のあるイメージがDUPEであることを前提としています。