我已经在
RestKit Object Mapping: difficulty using 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被更新时,将创建新的记录.当我删除一个事件时,它被删除.当我删除一个AudioSource它不会被删除.
如果我删除第二个setObjectMapping:forResourcePathPattern:withFetchRequestBlock,那么AudioSource被正确删除,但删除的事件不是.我在这个xml文件中有4个映射.
就像最后一次调用setObjectMapping:forResourcePathPattern:withFetchRequestBlock获胜.
我的解决方法是使用setObjectMapping:forResourcePathPattern:withFetchRequestBlock对最常更改的映射(在本例中为事件),并添加一个无效缓存,清空数据库和更新的按钮.必须有一些简单的东西我失踪了.
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's house,560' + 53'"
- longitudeDefault=""
- node="A 01330"
- repeaterId="1"
- serviceArea="Vista"
- serviceState="CA" />
- </winSystemRepeaters>
- </winSystem>
解决方法
我以前没有使用过管理对象,但是首先要做的是激活对象映射,网络请求和核心数据的restkit日志,以便您可以检查从服务器获取的是什么是restkit,映射如何工作,以及如何从CD获取东西,所以请尝试以下操作:
- //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不会搞砸,你需要定义不同的方法来映射每种对象,现在我认为第一个被覆盖.
如果这不起作用,你应该发布你如何删除代码中的东西,也许发布你的视图控制器的所有代码.可能发生的是,呼叫被您的代码覆盖在某处.你使用块吗?
希望有帮助!