核心数据:如何删除不在新数据中的对象

我已经学习了关于iOS5和iOS7的斯坦福大学讲座系列中的核心数据,并且已经使用核心数据成功制作了3个不同的应用程序。 但是我总是有一个我无法解决的关于核心数据的问题:

如果这些对象不存在于新数据中,是否有办法删除核心数据中的对象?

例如,假设我正在开发一个博物馆应用程序。 如果一个iPhone中的一些旧的Core-Data对象不存在于从Internet接收到的新数据中,则意味着这些旧对象在应用程序中不再需要,应该删除。 你如何删除这些? 更新和创build新的对象是很容易的,但是对于Core Data来说,删除过程是不可能的!

我可以删除所有对象并插入新的对象,但每次只修改,更改或删除一些对象。 所以延迟一切,再插入一切都不是一个有效的解决scheme,特别是考虑到你每次获取大约200个对象。

假如说

  • 您的核心数据实体具有唯一标识每个对象的属性“unique_id”
  • 服务器响应存储为字典数组(例如来自JSON响应),其中每个字典也包含“unique_id”

那么您可以执行以下操作:首先,从服务器的新对象中创build一个所有唯一ID的数组:

NSArray *uniqueIds = [serverResponse valueForKey:@"unique_id"]; 

然后获取所有不在这个数组中的id的对象。 这可以通过一个提取请求来完成:

 NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"YourEntity"]; NSPredicate *predicate = [NSPredicate predicateWithFormat:@"NOT unique_id IN %@", uniqueIds]; request.predicate = predicate; NSError *error; NSArray *outdatedObjects = [context executeFetchRequest:request error:&error]; if (outdatedObjects == nil) { // handle error ... } 

最后,删除过时的对象:

 for (YourEntity *obj in outdatedObjects) { [context deleteObject:obj]; } if (![context save:&error]) { // handle error ... } 

您可以获取所有现有的对象,循环遍历它们并检查您获取的对象。 如果旧对象不存在,请将其从CoreData中删除。 这里是一些伪代码,我怎么在我的应用程序中做到这一点:

  NSMutableSet *objectsToDelete = // Existing CoreData objects NSMutableSet *updatedObjects = [NSMutableSet set]; // Loop over your webservice response objects for (...) { // Compare to existing objects to check if it's a new object // If it is new add it to the updated objects set: if (updated) { [updatedObjects addObject:webserviceObject]; } else { // New object, insert it into CoreData } } // Calculate deleted objects [objectsToDelete minusSet:updatedObjects]; for (NSManagedObject *obj in objectsToDelete) { [obj delete]; } // Persist your changes