Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa 遍历NSManagedObjectContext对象?_Cocoa_Core Data_Nsmanagedobjectcontext - Fatal编程技术网

Cocoa 遍历NSManagedObjectContext对象?

Cocoa 遍历NSManagedObjectContext对象?,cocoa,core-data,nsmanagedobjectcontext,Cocoa,Core Data,Nsmanagedobjectcontext,我希望遍历NSManagedObjectContext中的所有对象,并手动更新它们。然后,应该更新每个托管对象。 最好的方法是什么?理论上,您可以迭代托管对象模型中的所有实体描述,为它们构建一个无谓词获取请求,然后循环所有返回的对象并进行一些更新。例如: // Given some NSManagedObjectContext *context NSManagedObjectModel *model = [[context persistentStoreCoordinator]

我希望遍历NSManagedObjectContext中的所有对象,并手动更新它们。然后,应该更新每个托管对象。
最好的方法是什么?

理论上,您可以迭代托管对象模型中的所有实体描述,为它们构建一个无谓词获取请求,然后循环所有返回的对象并进行一些更新。例如:

// 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:
或相关方法),或者确定当前实体是什么类(使用
entity
上的
managedObjectClassName
属性和
NSClassWithName()
方法).

这似乎是解决问题的一种非常严厉的方法。如果数据加载了坏数据,那么我建议在导入数据时修复它。蒂姆的回答对你所做的事情有帮助,但我强烈怀疑你的回答是错误的。在整个数据库中搜索潜在的坏数据是非常低效的。

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

您想做什么?您认为为什么需要这样做?在第一次创建时,许多对象都使用了错误的信息。我需要手动修复该问题。不需要强制转换,所有的fetch方法和-objectAtIndex:method返回id。NSManagedObject中的所有属性都可以通过KVC访问,并且可以通过-doesRespondToSelector:True查询,但是我倾向于对充斥着
doesRespondToSelector:
调用的代码感到失望-强制转换虽然不是严格必要的,但在以后的过程中可读性会更高。如果你知道“第一次”导入了错误的数据,我更同意这种方法然后您应该能够在导入时更正,而不是稍后。