2012-04-24 11 views
7

Buduję dwukierunkową aplikację do synchronizacji Dropbox. Ładuję obiekty z danych podstawowych, konwertuję je do JSON i wysyłam do Dropbox. Jednak po zrobieniu synchronizacji porównuję zestaw lokalnych plików JSON z plikami JSON Dropbox. Jeśli zostanie wykryty konflikt, zostanie zastosowana logika synchronizacji. W wyniku logiki synchronizacji można pobrać zdalny plik JSON i zastąpić lokalny plik JSON.iPhone RestKit Jak załadować lokalny plik JSON i zmapować go do głównej encji danych?

W efekcie otrzymuję mnóstwo plików JSON w lokalnym katalogu dokumentów.

Jak używać narzędzia RestKit do deserializacji lokalnych plików JSON z powrotem do obiektów za pomocą odwzorowań, które zdefiniowałem? RKTwitterCoreData tworzy rdzeń encji danych z internetowego JSON. Próbuję zrobić to samo z lokalnym plikiem JSON.

Istnieje kilka metod loadObjects, ale wszystkie z nich wydają się pracować z połączeń internetowych:

- (RKObjectLoader*)loadObjectsAtResourcePath:(NSString*)resourcePath delegate:(id<RKObjectLoaderDelegate>)delegate; 

Dziękujemy!

+0

Czy próbowałeś przekazać lokalną ścieżkę do metody loadObjectsAtResourcePath? – shannoga

Odpowiedz

0

Oto, czego używam dla danych podstawowych do JSON do konwersji danych rdzenia.

Oto jak zdefiniować zagnieżdżony model obiektu RestKit. Kiedy plik JSON tej struktury jest deserializowany, automatycznie utworzy dla ciebie wszystkie relacje zagnieżdżone, a nawet scali konteksty obiektów zarządzanych!

+(void)setupCoreDataObjectMapping 
{ 

RKObjectManager *objectManager = [RKObjectManager sharedManager ] ; 

// Setup our object mappings  
/*! 
Mapping by entity. Here we are configuring a mapping by targetting a Core Data entity with a specific 
name. This allows us to map back Twitter user objects directly onto NSManagedObject instances -- 
there is no backing model class! 
*/ 
//********************************  
RKManagedObjectMapping* nestedRelationshipMapping = [RKManagedObjectMapping mappingForEntityWithName:@"NestedRelationshipObject"]; 
//UUID determines which objects get updated and which ones get created during the mapping process 
nestedRelationshipMapping.primaryKeyAttribute = @"uuid"; 
[nestedRelationshipMapping mapKeyPathsToAttributes: 
@"IKeepTheseTheSame", @"IKeepTheseTheSame", 
@"AnotherValue",@"AnotherValue", 
//keep adding your attributes 
nil]; 
[objectManager.mappingProvider addObjectMapping:nestedRelationshipMapping]; 




//********************************  

RKManagedObjectMapping* mainPayloadMapping = [RKManagedObjectMapping mappingForEntityWithName:@"RealCoreDataEntity"]; 
mainPayloadMapping.primaryKeyAttribute = @"uuid"; 
[mainPayloadMapping mapKeyPathsToAttributes: 
@"companyName",@"companyName", 
//keep adding your attributes 
nil]; 


//this is the main payload. I create all of it's relationships before, and then add them to the mapping. 
[mainPayloadMapping mapRelationship:@"relationshipName" withMapping:nestedRelationshipMapping]; 
[objectManager.mappingProvider addObjectMapping:mainPayloadMapping]; 


[objectManager.mappingProvider setSerializationMapping:[mainPayloadMapping inverseMapping] forClass:[YourNSManagedObjectSubclass class]]; 


[objectManager.mappingProvider setMapping:nestedRelationshipMapping forKeyPath:@"mainPayloadToNestedDataRelationshipName"]; 
[objectManager.mappingProvider setMapping:mainPayloadMapping forKeyPath:@"wrapperToMainPayloadRelationshipName"]; 


//this is a top level JSON object. It's name will not be identified within the object, but it's relationshipName will be. The result of deserializing this object would be an object that is being wrapped. 
RKManagedObjectMapping* wrapperMapping = [RKManagedObjectMapping mappingForClass:[IconFileWrapper class]]; 
iconWrapperMapping.primaryKeyAttribute = @"uuid"; 
// keyPath and attribute names. must be even 
[iconWrapperMapping mapKeyPathsToAttributes:@"uuid",@"uuid",nil]; 
//keep adding your attributes 
[iconWrapperMapping mapRelationship:@"relationshipName" withMapping:mainPayloadMapping]; 

[objectManager.mappingProvider addObjectMapping:wrapperMapping]; 
[objectManager.mappingProvider setSerializationMapping:[wrapperMapping inverseMapping] forClass:[YourWrapperNSManagedObjectSubclass class]]; 


} 
6

To z docs Rest-Kit, nie próbowałem jeszcze, ale wygląda na początku jak korzystać ciąg JSON.

Można go znaleźć tutaj: look at the bottom of the page

NSString* JSONString = @"{ \"name\": \"The name\", \"number\": 12345}"; 
NSString* MIMEType = @"application/json"; 
NSError* error = nil; 
id<RKParser> parser = [[RKParserRegistry sharedRegistry] parserForMIMEType:MIMEType]; 
id parsedData = [parser objectFromString:JSONString error:&error]; 
if (parsedData == nil && error) { 
    // Parser error... 
} 


RKObjectMappingProvider* mappingProvider = [RKObjectManager sharedManager].mappingProvider; 
RKObjectMapper* mapper = [RKObjectMapper mapperWithObject:parsedData mappingProvider:mappingProvider]; 
RKObjectMappingResult* result = [mapper performMapping]; 
if (result) { 
    // Yay! Mapping finished successfully 
} 

EDIT zobaczyć rob5408 notatkę o oszczędność kontekstu:

[[RKObjectManager sharedManager].objectStore.managedObjectContext save:&error]; 
+0

Pracował świetnie. Dzięki! – jcanfield55

+1

Dzięki @shannoga, to było super pomocne. Chciałbym zauważyć, że musiałem następnie zapisać kontekst Core Data, aby obiekty przetrwały. [[ROMbjectManager sharedManager] .objectStore.managedObjectContext save: & error]; – rob5408

+0

Świetnie, dziękuję @ rob5408 za notatkę dodałem do odpowiedzi – shannoga

1

Jeśli chcesz mieć dokładnie takie samo zachowanie jak " domyślnie "Funkcja Restkit - (void)objectLoader:(RKObjectLoader*)objectLoader didLoadObjects:(NSArray*)objects możesz tego użyć, aby uzyskać cenny objects NSArray:

RKObjectMappingResult* result = [mapper performMapping]; 
NSArray* objects = [result asCollection]; 
Powiązane problemy