[英]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個對象。
假如說
那么您可以執行以下操作:首先,從服務器的新對象創建一個包含所有唯一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.