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

时间:2014-06-30 14:52:42

标签: ios core-data

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

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

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

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

2 个答案:

答案 0 :(得分:7)

假设

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

然后你可以执行以下操作:首先,从中创建一个包含所有唯一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 ...
}

答案 1 :(得分:2)

您可以获取所有现有对象,遍历它们并检查所获取的对象。如果旧对象不存在,请将其从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