2012-07-11 8 views
10

Sprawdziłem odpowiedź na RestKit Object Mapping: difficulty using setObjectMapping:forResourcePathPattern:withFetchRequestBlock i działa, ale tylko dla ostatniego mapowania. Przykład:RestKit usuń stare dane z danych podstawowych za pomocą setObjectMapping

RKManagedObjectMapping *audioSourcesMapping = [RKManagedObjectMapping mappingForEntityWithName:kEntityAudioSources inManagedObjectStore:objectStore]; 
[audioSourcesMapping mapKeyPath:@"icon" toAttribute:@"icon"]; 
[audioSourcesMapping mapKeyPath:@"name" toAttribute:@"name"]; 
[audioSourcesMapping mapKeyPath:@"notes" toAttribute:@"notes"]; 
[audioSourcesMapping mapKeyPath:@"section" toAttribute:@"section"]; 
[audioSourcesMapping mapKeyPath:@"url" toAttribute:@"url"]; 
audioSourcesMapping.primaryKeyAttribute = @"name"; 
[wsiObjectManager.mappingProvider registerMapping:audioSourcesMapping withRootKeyPath:@"winSystem.winSystemAudioSources.winSystemAudioSource"]; 


[wsiObjectManager.mappingProvider setObjectMapping:audioSourcesMapping forResourcePathPattern:kWinSystemInfoXml 
          withFetchRequestBlock:^NSFetchRequest *(NSString *resourcePath) { 
           return [AudioSources fetchRequest]; 
          }]; 


RKManagedObjectMapping *eventsMapping = [RKManagedObjectMapping mappingForEntityWithName:kEntityEvents inManagedObjectStore:objectStore]; 
[eventsMapping mapKeyPath:@"contact" toAttribute:@"contact"]; 
[eventsMapping mapKeyPath:@"startDate" toAttribute:@"startDate"]; 
[eventsMapping mapKeyPath:@"endDate" toAttribute:@"endDate"]; 
[eventsMapping mapKeyPath:@"icon" toAttribute:@"icon"]; 
[eventsMapping mapKeyPath:@"location" toAttribute:@"location"]; 
[eventsMapping mapKeyPath:@"name" toAttribute:@"name"]; 
[eventsMapping mapKeyPath:@"notes" toAttribute:@"notes"]; 
[eventsMapping mapKeyPath:@"section" toAttribute:@"section"]; 
[eventsMapping mapKeyPath:@"url" toAttribute:@"url"]; 
eventsMapping.primaryKeyAttribute = @"name"; 
[wsiObjectManager.mappingProvider registerMapping:eventsMapping withRootKeyPath:@"winSystem.winSystemEvents.winSystemEvent"];  


[wsiObjectManager.mappingProvider setObjectMapping:eventsMapping forResourcePathPattern:kWinSystemInfoXml 
          withFetchRequestBlock:^NSFetchRequest *(NSString *resourcePath) { 
           return [Events fetchRequest]; 
          }]; 

Wszystkie mapowania działają świetnie. Gdy źródłowy plik XML zostanie zaktualizowany, tworzone są nowe rekordy. Po usunięciu Event zostanie on usunięty. Po usunięciu AudioSource nie zostanie on usunięty.

Jeśli usunę drugi setObjectMapping:forResourcePathPattern:withFetchRequestBlock, wówczas AudioSource zostanie poprawnie usunięty, ale usunięty Event nie jest usuwany. Mam 4 mapowania, z którymi pracuję w tym pliku xml.

To jak ostatnie połączenie z setObjectMapping:forResourcePathPattern:withFetchRequestBlock wygrywa.

Moje obejście polega na użyciu setObjectMapping:forResourcePathPattern:withFetchRequestBlock na mapowaniu, które zmienia się najczęściej (w tym przypadku Events), i dodać przycisk, który unieważnia pamięć podręczną, opróżnia bazę danych i aktualizuje. Musi być coś prostego, czego mi brakuje.

Xcode: 4.3.3 RestKit: 0.10.1

Przykładowy plik XML. Te wszystkie ładunki w porządku, ale tylko usuwa z danych podstawowych mapowanie przy użyciu ostatniej setObjectMapping:forResourcePathPattern:withFetchRequestBlock

<?xml version="1.0" encoding="UTF-8"?> 
    <winSystem> 
     <winSystemAudioSources> 
      <winSystemAudioSource 
       icon="audio.png" 
       name="Hub Audio" 
       notes="Cleaner Sound. Audio is delayed by about 30 seconds. This is a great way to see if you are making into the WIN System." 
       section=" WIN System" 
       url="http://stream.winsystem.org:443/2560.mp3" /> 
     </winSystemAudioSources> 
     <winSystemEvents> 
      <winSystemEvent 
       contact="" 
       endDate="" 
       icon="net.png" 
       location="WIN System reflector 9100" 
       name="Insomniac Trivia Net" 
       notes="Every Night @ 23:00 PT - WIN System reflector 9100. Join the Yahoo! group: http://groups.yahoo.com/group/insomniac-net/join" 
       section="Ham Nets" 
       startDate="" 
       url="http://www.thedeanfamily.com/WinSystem/InsomniacNet.htm" /> 
     </winSystemEvents> 
     <winSystemLinks> 
      <winSystemLink 
       icon="winsystem.png" 
       name=" WIN System Home Page" 
       notes="The WIN System Home Page" 
       section=" WIN System" 
       type="web" 
       url="http://www.winsystem.org/" /> 
     </winSystemLinks> 
     <winSystemRepeaters> 
      <winSystemRepeater 
       callSign="K6JSI" 
       freqOffsetPl="448.800* (-) 100.0" 
       grouping="winsystem" 
       latitudeDefault="" 
       locationElevation="Shorty's house, 560' + 53'" 
       longitudeDefault="" 
       node="A 01330" 
       repeaterId="1" 
       serviceArea="Vista" 
       serviceState="CA" /> 
     </winSystemRepeaters> 
    </winSystem> 
+1

Jak wygląda Twój źródłowy plik XML? Czy mają one jako znaczniki zagnieżdżone , i ? –

+0

@Steven Hepting - Edytowałem pytanie, aby dodać próbkę pliku xml. Dziękuję za pytanie! – Kent

+0

W jaki sposób usuwasz rzeczy? czy możesz dodać ten kod? prawdopodobnie jedno połączenie jest nadpisywane. Sprawdź moją odpowiedź, aby móc debugować zachowanie podstawowych danych. – clopez

Odpowiedz

2

nie użyłem obiektów zarządzanych wcześniej, ale pierwszą rzeczą do zrobienia jest, aby włączyć dziennik restkit nad mapowania obiektowo, sieć żądania i podstawowe dane, dzięki czemu można sprawdzić, co jest restkit uzyskanie od serwera, jak mapowanie pracuje i jak jest pobieranie rzeczy z CD, więc spróbuj wykonać następujące czynności:

//This can be added in your app delegate 
RKLogConfigureByName("RestKit/Network", RKLogLevelTrace); 
RKLogConfigureByName("RestKit/ObjectMapping", RKLogLevelTrace); 
RKLogConfigureByName("RestKit/CoreData", RKLogLevelTrace); 

Patrząc na kod, jesteś za pomocą ta sama ścieżka dla obu mapowań tutaj:

// forResourcePathPattern:kWinSystemInfoXml 
[wsiObjectManager.mappingProvider setObjectMapping:audioSourcesMapping forResourcePathPattern:kWinSystemInfoXml 
         withFetchRequestBlock:^NSFetchRequest *(NSString *resourcePath) { 
          return [AudioSources fetchRequest]; 
         }]; 

// forResourcePathPattern:kWinSystemInfoXml 
[wsiObjectManager.mappingProvider setObjectMapping:eventsMapping forResourcePathPattern:kWinSystemInfoXml 
         withFetchRequestBlock:^NSFetchRequest *(NSString *resourcePath) { 
          return [Events fetchRequest]; 
         }]; 

myślę, że to może być przyczyną konfliktu, ponieważ RK wybrać jeden z dwóch zasobów być odwzorowany na tej ścieżce, więc należy:

  1. Debug co jest Rdzeń danych robi.
  2. Spróbuj użyć odwzorowania na ścieżkę klucza zamiast wzoru ścieżki zasobu, więc RK nie jest pomieszany, musisz zdefiniować różne sposoby mapowania każdego rodzaju obiektu, teraz myślę, że pierwszy jest nadpisywany .

Jeśli to nie zadziała, powinieneś opublikować, w jaki sposób usuwasz rzeczy z kodu, może opublikować cały kod z kontrolera widoku. Może się zdarzyć, że połączenia są nadpisywane przez twój kod gdzieś. Czy korzystasz z bloków?

Nadzieję, że pomaga!

+0

Mam dane wyjściowe komunikatu dziennika. Nie usuwam z kodu. Kiedy edytuję xml i usuwam element, przy następnej aktualizacji elementy powinny zostać usunięte. Działa dla ostatniego 'mappingProvider'. Jedyne bloki, których używam, znajdują się powyżej w 'withFetchRequestBlock'. Przyjrzę się mapowaniu kluczowego podejścia i powrócę do wyników. Dziękuję Ci. – Kent

+0

A jaki jest wynik działania głównego dziennika danych podczas wykonywania takich operacji? – clopez

Powiązane problemy