2010-04-28 240 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

如果托管对象是使用“错误数据”创建的,我会检查并确保已在模型中为所有实体的所有属性设置默认值。通过这种方式,您可以确定每当将对象插入到上下文中时,它都将包含这些值。从那里,你可以设置任何你需要的属性。