我的服务器上有一个项目列表,我的应用在 CoreData 中有一个副本。
我的一个 Web API 下载了最新列表。
我已经成功编写了更新列的代码,并将新的行/项目添加到我的本地 CoreData 存储中。这是处理从服务器接收到的项目的代码(“名称”唯一标识一行,假设Object
是实体):
NSFetchRequest* request = [[NSFetchRequest alloc] init];
[request setPredicate:[NSPredicate predicateWithFormat:@"name == %@", dictionary[@"name"]]];
[request setEntity:[NSEntityDescription entityForName:@"Object"
inManagedObjectContext:managedObjectContext]];
error = nil;
ObjectData* object = [[managedObjectContext executeFetchRequest:request error:&error] lastObject];
//### Handle error.
if (object == nil)
{
object = (ObjectData*)[NSEntityDescription insertNewObjectForEntityForName:@"Object"
inManagedObjectContext:managedObjectContext];
}
object.name = dictionary[@"name"];
object.place = dictionary[@"place"];
...
error = nil;
[managedObjectContext save:&error];
//### Handle error.
上面的代码确实将现有项目和新项目从服务器同步到 CoreData。但是,在服务器上删除的行不会从 CoreData 中删除。
同步删除的有效方法是什么?注意:Objects
有关系,所以简单地删除整个批次并再次添加它们是行不通的。
例如,如何形成一个查询来删除所有名称不在下载的最新列表中的行?