CoreData+RestKitを使用するiOSアプリを作成しています。サーバーから同期すると、ローカルの同期されていないエンティティが無効になるという問題があります。RestKit0.10.1を使用しています
シナリオ: サーバーからのデータを同期します。ローカルにエントリを追加します(これはサーバーと同期されていません)。サーバーからのデータを同期します。
結果: ローカルエンティティはオブジェクトグラフから除外されます。(私はまだそれをデータベースで見ることができます、それはただ接続されていません)
JSON
{
ThreadId: 322,
ThreadMessages:
[
{
Text: "Hello Joe",
AuthorId: 635236,
AuthorName: "Trudy",
Timestamp: "2012-06-09T15:42:45.757",
ThreadMessageId: 546,
ThreadId: 322
}
]
}
マッピング
threadMessageMapping = [RKManagedObjectMapping mappingForClass:[ThreadMessage class] inManagedObjectStore:objectStore];
threadMessageMapping.primaryKeyAttribute = @"threadMessageId";
[threadMessageMapping mapKeyPath:@"ThreadMessageId" toAttribute:@"threadMessageId"];
[threadMessageMapping mapKeyPath:@"ThreadId" toAttribute:@"threadId"];
[threadMessageMapping mapKeyPath:@"Text" toAttribute:@"text"];
[threadMessageMapping mapKeyPath:@"AuthorId" toAttribute:@"authorId"];
[threadMessageMapping mapKeyPath:@"AuthorName" toAttribute:@"authorName"];
[threadMessageMapping mapKeyPath:@"Timestamp" toAttribute:@"timestamp"];
threadMapping = [RKManagedObjectMapping mappingForClass:[Thread class] inManagedObjectStore:objectStore];
threadMapping.primaryKeyAttribute = @"threadId";
threadMapping mapKeyPath:@"ThreadId" toAttribute:@"threadId"];
[threadMapping mapKeyPath:@"ThreadMessages" toRelationship:@"threadMessages" withMapping:ThreadMessageMapping];
詳細:
上記のマッピングをアプリで問題なく使用できます。正常に機能する新しいThreadMessageをローカルに挿入することもできます(threadMessageIdは0です)。サーバーから同期し、Restkit/CoreDataが新しいアイテムを検出すると問題が発生します。オブジェクトグラフにとどまりません。sqlite dbを調べたところ、テーブルZTHREAD
内のリンクが無効になっていることが原因であることがわかりました。ZTHREADMESSAGE
サーバーだけから来ていないアイテムをRestKitに残す方法はありますか?
また、connectRelationshipを使用して接続をハイドレイトしようとしましたが、私のjsonでは実行できないようです。
この行により、すべてのエンティティのZTHREAD
列ZTHREADMESSAGES
が空白になります
[threadMapping connectRelationship:@"threadMessages" withObjectForPrimaryKeyAttribute:@"threadId"];
逆リレーションシップをマップすると、ZTHREAD
列は正常ですが、再同期時に新しいローカルアイテムがオブジェクトグラフから削除されます。
[threadMessageMapping mapKeyPath:@"ThreadMessageId" toAttribute:@"threadMessageId"];
[threadMessageMapping mapRelationship:@"thread" withMapping:threadMapping];
[threadMessageMapping connectRelationship:@"thread" withObjectForPrimaryKeyAttribute:@"threadMessageId"];
RestKitが新しいThreadMessageを無効にする場所を特定できませんでした。どこかにあると思いますRKObjectMappingOperation
が、魔法がどこで起こっているのかわかりません。ThreadMessage.ThreadIdが2回目の同期後にnillされたことがわかります。