我已经从iOS5和iOS7的斯坦福讲座系列中学到了核心数据,并且我已经使用Core Data成功制作了3个不同的应用程序。但我总是遇到一个我无法解决的关于核心数据的问题:
如果新数据中没有这些对象,有没有办法可以删除Core数据中的对象?
例如,假设我正在开发一个博物馆应用程序。如果iPhone中的一些旧的Core-Data对象不存在于从Internet接收的新数据中,则意味着应用程序中不再需要那些旧对象,应将其删除。你怎么能删除这些?更新和创建新对象很简单,但是使用Core Data,删除具有消除过程的对象是不可能的!
我可以删除所有对象并插入新对象,但每次只修改,更改或删除一些对象。所以延迟一切并再次插入所有内容并不是一个有效的解决方案,特别是考虑到你每次都要获取大约200个对象。
答案 0 :(得分:7)
假设
然后你可以执行以下操作:首先,从中创建一个包含所有唯一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