2014-02-12 2 views
2

서버에서 개체 목록을 가져올 때 RestKit 0.20에서 데이터베이스에 중복 항목을 만드는 데 문제가 있습니다. 로컬로 생성하고 서버에 보낸 개체는 매핑 결과를 저장할 때 업데이트되지 않고 대신 복제됩니다. 나는 그것이이 버그와 관련이 있다고 생각한다 : https://github.com/RestKit/RestKit/issues/1613, 나는 잠시 후에 나올 임시 패치를 찾고있다. 결과가RestKit RKObjectManager : getObjectsAtPath - 사용자 지정 처리

[myRKObjectManager getObjectsAtPath:path parameters:params success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) 

에서 돌아올 때 나는

[myRKObjectManager.managedObjectStore.mainQueueManagedObjectContext saveToPersistentStore:&error]) 

을 실행하기 전에이의 중복을 추려 수 있습니까? 나는 문서를 파헤 치고 불필요한 삽입을 제거하는 방법을 이해하지 못하고있다.

UPDATE : 답변 @Wain합니다 : 따라서

설정 :

myRKobjectManager = [RKObjectManager managerWithBaseURL:[NSURL URLWithString:urlString]]; 
NSManagedObjectModel *managedObjectModel = [NSManagedObjectModel mergedModelFromBundles:nil]; 
RKManagedObjectStore *managedObjectStore = [[RKManagedObjectStore alloc] initWithManagedObjectModel:managedObjectModel]; 

NSError *error; 

NSPersistentStore *persistentStore = [managedObjectStore addSQLitePersistentStoreAtPath:[RKApplicationDataDirectory() stringByAppendingPathComponent:[self databaseFilename]] fromSeedDatabaseAtPath:nil withConfiguration:nil options:@{NSMigratePersistentStoresAutomaticallyOption:@YES, NSInferMappingModelAutomaticallyOption:@YES} error:&error]; 

NSAssert(persistentStore, @"Failed to add persistent store with error: %@", error); 

// Create the managed object contexts 
[managedObjectStore createManagedObjectContexts]; 

// Configure a managed object cache to ensure we do not create duplicate objects 
managedObjectStore.managedObjectCache = [[RKInMemoryManagedObjectCache alloc] initWithManagedObjectContext:managedObjectStore.persistentStoreManagedObjectContext]; 

// Set up response routing 
RKEntityMapping *partyMapping = [Party objectMappingInManagedObjectStore:managedObjectStore withCustomerMapping:customerMapping notificationMapping:notificationMapping]; 

RKResponseDescriptor *partyResponseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:partyMapping method:RKRequestMethodGET pathPattern:@"api/allparties" keyPath:@"parties" statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)]; 

[[RKObjectManager sharedManager] addResponseDescriptor:partyResponseDescriptor]; 

Entity 클래스 선언 :

@interface Party : NSManagedObject<PostRequestDelegate> 

NSManagedObject (ActiveRecord) 

파티 개체가있는 범주를 사용하여 만들어진 를 통해 데이터베이스에 저장

Party *newParty = [Party object]; 

및 사용 :

[myRKobjectManager.managedObjectStore.mainQueueManagedObjectContext saveToPersistentStore:&error] 

매핑은 사용 :

RKEntityMapping* partyMapping = [RKEntityMapping mappingForEntityForName:@"Party" inManagedObjectStore:managedObjectStore]; 
[partyMapping addAttributeMappingsFromDictionary:@{ 
                @"added_date": @"addedDate", 
                @"id": @"partyId", 
                @"modified_date": @"modifiedDate", 
                @"name": @"name", 
                }]; 
[email protected][@"addedDate"]; 
[partyMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"customer" toKeyPath:@"customer" withMapping:customerMapping]]; 
[partyMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"notification_history" toKeyPath:@"notifications" withMapping:notificationMapping]]; 
+0

어떤 매핑을 사용하고 있습니까? 다중 컨텍스트로 작업하고 있습니까? 로컬에서 생성 된 객체를 어떻게 저장하고 있습니까? – Wain

+0

@Wain 더 많은 설정 정보로 게시물을 업데이트했습니다. 감사! –

+0

RestKit에서 만드는 대신 자신 만의 컨텍스트를 만드는 이유는 무엇입니까? – Wain

답변

0

당신이 당신의 partyId에 identificationAttributes을 변경 시도? 각 파티 객체의 고유 한 속성이라고 가정합니다. 그런 다음 Restkit은 동일한 partyId를 가진 객체가 코어 데이터에 이미 있는지 확인하고 새 객체를 만드는 대신이를 업데이트합니다.

어떻게 작동하는지에 대한 자세한 내용은 http://restkit.org/api/latest/Classes/RKManagedObjectRequestOperation.html의 설명서에서 "엔티티 ID"섹션을 참조하십시오.

+0

예, 많은 조합을 시도, 당원 원래 –