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>
Jak wygląda Twój źródłowy plik XML? Czy mają one jako znaczniki zagnieżdżone , i ? –
@Steven Hepting - Edytowałem pytanie, aby dodać próbkę pliku xml. Dziękuję za pytanie! – Kent
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