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

coo*_*994 1 core-data ios

我从iOS5和iOS7的Stanford Lecture系列中学到了Core Data,并且我使用Core Data成功制作了3个不同的应用程序.但我总是遇到一个我无法解决的关于核心数据的问题:

有没有办法可以删除Core数据中的对象,如果新数据中没有这些对象?

例如,假设我正在开发一个博物馆应用程序.如果iPhone中的一些旧的Core-Data对象不存在于从Internet接收的新数据中,则意味着应用程序中不再需要那些旧对象,应将其删除.你怎么能删除这些?更新和创建新对象很简单,但使用Core Data,删除具有消除过程的对象是不可能的!

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

Mar*_*n R 7

假如说

  • 您的Core Data实体具有唯一标识每个对象的属性"unique_id",以及
  • 服务器响应存储为字典数组(例如,来自JSON响应),其中每个字典还包含"unique_id",

然后,您可以执行以下操作:首先,从服务器的新对象创建一个包含所有唯一ID的数组:

NSArray *uniqueIds = [serverResponse valueForKey:@"unique_id"];
Run Code Online (Sandbox Code Playgroud)

然后使用不在此数组中的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 ...
}
Run Code Online (Sandbox Code Playgroud)

最后,删除过时的对象:

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