Я просмотрел ответ на RestKit Object Mapping :трудность с использованием setObjectMapping :forResourcePathPattern :withFetchRequestBlock , и он работает, но только для последнего сопоставления. Пример:
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];
}];
Все карты работают отлично. При обновлении исходного xml создаются новые записи. Когда я удаляю Event
, он удаляется. Когда я удаляю AudioSource
, он не удаляется.
Если я удалю второй setObjectMapping:forResourcePathPattern:withFetchRequestBlock
, то AudioSource
удаляется правильно, а удаленный Event
— нет. У меня есть 4 сопоставления, с которыми я работаю в этом XML-файле.
Это похоже на то, что последний звонок на setObjectMapping:forResourcePathPattern:withFetchRequestBlock
побеждает.
Мой обходной путь — использовать setObjectMapping:forResourcePathPattern:withFetchRequestBlock
для отображения, которое меняется чаще всего (, в данном случаеEvents
)и добавьте кнопку, которая аннулирует кеш, очистит базу данных и обновит. Должно быть что-то простое, что мне не хватает.
Xcode :4.3.3 РестКит :0.10.1
Пример xml-файла. Все это загружается нормально, но только удаляет из основных данных сопоставление, используя последнийsetObjectMapping:forResourcePathPattern:withFetchRequestBlock