簡體   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