10

我已经查看了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 时,会创建新记录。当我删除 aEvent时,它会被删除。当我删除AudioSource它时,它不会被删除。

如果我删除第二个setObjectMapping:forResourcePathPattern:withFetchRequestBlock,则AudioSource正确删除,但删除Event的不是。我在这个 xml 文件中有 4 个正在使用的映射。

这就像最后一次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's house, 560' + 53'"
                longitudeDefault=""
                node="A 01330"
                repeaterId="1"
                serviceArea="Vista"
                serviceState="CA" />
        </winSystemRepeaters>
    </winSystem>
4

1 回答 1

2

我以前没有使用过托管对象,但这里要做的第一件事是通过对象映射、网络请求和核心数据激活 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 选择两种资源之一映射到该路径,所以你应该:

  1. 调试 Core Data 在做什么。
  2. 尝试使用映射键路径方法而不是资源路径模式,这样 RK 就不会搞砸了,你需要定义不同的方法来映射每种对象,现在我认为第一个被覆盖了。

如果这不起作用,您应该发布您如何在代码中删除内容,也许从您的视图控制器发布所有代码。可能发生的情况是调用被您的代码覆盖在某处。你在用积木吗?

希望有帮助!

于 2012-08-23T14:02:13.307 回答