RestKit удаляет старые данные из основных данных с помощью setObjectMapping
Я рассмотрел ответ на Отображение объектов RestKit: сложность с использованием 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
RestKit: 0.10.1
Пример XML файла. Это все загружает штраф, но удаляет только данные ядра с помощью последнего 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 house, 560' + 53'"
longitudeDefault=""
node="A 01330"
repeaterId="1"
serviceArea="Vista"
serviceState="CA" />
</winSystemRepeaters>
</winSystem>
Ответы
Ответ 1
Я раньше не использовал Managed Objects, но первое, что нужно сделать, это активировать сопоставление объектов restkit с объектами, сетевой запрос и данные ядра, чтобы вы могли проверить, что происходит с сервером, что происходит с сервером, как работает сопоставление и как извлекать вещи с компакт-диска, попробуйте следующее:
//This can be added in your app delegate
RKLogConfigureByName("RestKit/Network", RKLogLevelTrace);
RKLogConfigureByName("RestKit/ObjectMapping", RKLogLevelTrace);
RKLogConfigureByName("RestKit/CoreData", RKLogLevelTrace);
Посмотрев на свой код, вы используете один и тот же путь для обоих сопоставлений здесь:
// 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];
}];
Я думаю, что это может вызвать конфликт, потому что RK выбирает один из обоих ресурсов для сопоставления с этим путем, поэтому вы должны:
- Отладка, что делают основные данные.
- Попробуйте использовать сопоставление для подхода к ключевому пути вместо шаблона пути ресурса, поэтому RK не перепутается, вам нужно определить различные способы сопоставления каждого типа объектов, прямо сейчас, я думаю, что первый из них перезаписывается.
Если это не сработает, вы должны опубликовать, как вы удаляете вещи в своем коде, возможно, разместите весь код с вашего контроллера. Что может случиться, так это то, что вызовы где-то переписываются вашим кодом. Вы используете блоки?.
Надеюсь, что это поможет!