2010-04-28 138 views
4

我想遍歷NSManagedObjectContext中的所有對象,並手動更新它們。然後,每個管理對象都應該更新。 這樣做的最好方法是什麼?通過NSManagedObjectContext對象迭代?

+1

你想做什麼?你爲什麼認爲你需要這樣做? – 2010-04-28 16:23:51

+0

在第一次,許多對象被創建與錯誤的信息。我需要手動修復它。 – cactus 2010-04-28 17:12:00

回答

5

理論上,您可以遍歷託管對象模型中的所有實體描述,爲它們構建一個無謂詞獲取請求,然後遍歷所有返回的對象並進行一些更新。例如:

// Given some NSManagedObjectContext *context 
NSManagedObjectModel *model = [[context persistentStoreCoordinator] 
           managedObjectModel]; 
for(NSEntityDescription *entity in [model entities]) { 
    NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease]; 
    [request setEntity:entity]; 
    NSError *error; 
    NSArray *results = [context executeFetchRequest:request error:&error]; 
    // Error-checking here... 
    for(NSManagedObject *object in results) { 
     // Do your updates here 
    } 
}

注意,就可以把NSManagedObjects或者通過(使用isKindOfClass:或相關方法)類相等性測試或搞清楚當前實體是什麼類(使用在entitymanagedObjectClassName屬性返回必要與NSClassWithName()方法結合)。

+0

無需投射,所有提取方法和-objectAtIndex:方法都會返回id。 NSManagedObject中的所有屬性都可以通過KVC訪問,可以通過-doesRespondToSelector來查詢: – 2010-04-28 18:02:22

+0

確實如此,但我傾向於使用'doesRespondToSelector:'調用拋出的代碼感到沮喪 - 鑄造雖然不是絕對必要,但可以是在路上更多的可讀性。 – Tim 2010-04-28 18:27:48

4

這似乎是一個非常重的手段來解決這個問題。如果數據正在加載不良數據,那麼我會強烈建議在導入數據時修復它。蒂姆的答案會爲你正在做的工作,但我強烈懷疑你是錯誤的。通過整個數據庫來查找潛在的錯誤數據是非常低效的。

+0

我同意這種方法遠遠超出了我發佈的答案 - 如果您知道錯誤的數據是在第一次導入「,那麼您應該能夠在導入時更正,而不是晚些時候。 – Tim 2010-04-28 18:26:56

0

如果託管對象是使用「錯誤數據」創建的,我會檢查並確保已在模型中爲所有實體的所有屬性設置默認值。通過這種方式,您可以確定每當將對象插入到上下文中時,它都將包含這些值。從那裏,你可以設置任何你需要的屬性。