我正在尝试以简单的方式从Web服务同步我的数据。我使用AFNetworking下载数据,并在每个对象上使用唯一标识符,我想插入,删除或更新该数据。
问题在于,使用Core Data,您必须在NSObjectManagedContext中实际插入对象以实例化NSManagedObjects。像这样:
MyModel *model = (MyModel *)[NSEntityDescription insertNewObjectForEntityForName:@"MyModel" inManagedObjectContext:moc];
model.value = [jsonDict objectForKey:@"value"];
因此,当我从Web服务获取数据时,我会立即将它们插入Core Data中。因此,没有真正的同步:我只是事先删除所有内容,然后插入从我的Web服务返回的内容。
我想有更好的方法可以做到这一点,但我不知道怎么做。有什么帮助吗?
答案 0 :(得分:12)
您正在遇到经典的插入/更新/删除范例。
答案是,这取决于。如果您获得了一大块json数据,那么您可以使用KVC从该块中提取唯一ID并对您的上下文进行提取以找出已存在的内容。从那里开始,它是对数据块的简单循环,适当地插入和更新。
如果你没有像这样的好块中获取数据,那么你可能需要对每个记录进行一次获取以确定它是插入还是更新。这要贵得多,应该避免。建议手动批量提取。
删除与获取/更新一样昂贵,因为您需要获取对象以删除它们,因此您也可以正确地处理更新。
是的,有一种从Core Data对象构建字典的有效方法。从Core Data获取现有对象数组后,可以将其转换为包含以下内容的字典:
NSArray *array = ...; //Results from Core Data fetch
NSDictionary *objectMap = [NSDictionary dictionaryWithObjects:array forKeys:[array valueForKey:@"identifier"]];
这假设您的Core Data实体中有一个名为identifier
的属性。根据需要更改名称。
使用这一行代码,您现在可以在NSDictionary
中拥有所有现有对象,然后在行走JSON时可以查看这些对象。
答案 1 :(得分:0)
最简单的方法是将Json恢复到正确映射到它的实体。映射后,确定是否已存在与实体ID匹配的对象,如果是,则获取实体并合并更改。如果没有,请在Core Data中创建一个新实体并将Json还原到它。
我正在建立一个应用程序,我做客户端与Evernote同步。它们在所有对象和服务器级别保留syncUpdate编号。因此,当我开始同步时,检查我的客户端syncUpdate计数是否小于服务器。如果是这样,我知道我不同步。如果我的updateCount是400并且服务器是410,我告诉服务器向我提供updateCount 400和410之间的所有对象。然后我检查是否已经有对象并执行我的更新/创建。
每次在服务器上修改对象时,对象updateCount都会随服务器一起递增。
服务器还会保留上次更新的时间戳,我也可以查看。