我正在编写一个使用 CoreData+RestKit 的 iOS 应用程序。我有一个问题,当我从服务器同步时,本地未同步的实体无效。我正在使用 RestKit 0.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 在第二次同步后被取消了。