10

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ても削除されません。

2番目を削除するとsetObjectMapping:forResourcePathPattern:withFetchRequestBlockAudioSourceは正しく削除されますが、削除されEventません。この xml ファイルで作業している 4 つのマッピングがあります。

setObjectMapping:forResourcePathPattern:withFetchRequestBlock勝利へのラストコールのようなものです。

私の回避策は、setObjectMapping:forResourcePathPattern:withFetchRequestBlock最も頻繁に変更されるマッピング (この場合はEvents) を使用し、キャッシュを無効にするボタンを追加し、データベースを空にして更新することです。私が見逃している単純なものがあるに違いありません。

Xcode: 4.3.3 レストキット: 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. CoreDataが行っていることをデバッグします。
  2. リソースパスパターンの代わりにキーパスアプローチのマッピングを使用してみてください。RKが混乱しないように、各種類のオブジェクトをマッピングするさまざまな方法を定義する必要があります。現在、最初のオブジェクトは上書きされていると思います。

それでも問題が解決しない場合は、コード内のコードをどのように削除するかを投稿する必要があります。おそらく、ViewControllerからすべてのコードを投稿してください。発生する可能性があるのは、呼び出しがどこかのコードによって上書きされていることです。ブロックを使用していますか?

お役に立てば幸いです。

于 2012-08-23T14:02:13.307 に答える