繁体   English   中英

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

[英]Core Data: How to delete objects that are not in new data

我已经从Stanford Lecture系列的iOS5和iOS7了解了Core Data,并且使用Core Data成功制作了3种不同的应用程序。 但是对于核心数据,我始终无法解决一个问题:

如果新数据中不存在这些对象,有没有办法删除这些对象?

例如,假设我正在开发博物馆应用程序。 而且,如果从Internet接收到的新数据中不包含iPhone中的某些旧的Core-Data对象,则意味着应用程序中不再需要这些旧对象,应将其删除。 您如何删除这些? 更新和创建新对象很容易,但是对于Core Data,无法通过消除过程删除它们!

我可以删除所有对象并插入新对象,但是每次只有几个对象被修改,更改或删除。 因此,延迟所有内容并再次插入所有内容并不是一种有效的解决方案,尤其是考虑到您每次要获取约200个对象。

假如说

  • 您的核心数据实体具有属性“ 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 ...
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM