【问题标题】:Iterate through NSManagedObjectContext objects?遍历 NSManagedObjectContext 对象?
【发布时间】:2010-04-28 16:18:01
【问题描述】:

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

【问题讨论】:

  • 你想做什么?为什么你认为你需要这样做?
  • 第一次,许多对象被错误的信息创建。我需要手动修复它。

标签: cocoa core-data nsmanagedobjectcontext


【解决方案1】:

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

// 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
    }
}

请注意,您可以通过测试类相等性(使用isKindOfClass: 或相关方法)或通过确定当前实体是什么类(使用entity 上的managedObjectClassName 属性来强制转换返回的NSManagedObjects结合NSClassWithName() 方法)。

【讨论】:

  • 强制转换不是必需的,所有的 fetch 方法和 -objectAtIndex: 方法都返回 id。 NSManagedObject 中的所有属性都可以通过 KVC 访问,并且可以通过 -doesRespondToSelector 进行查询:
  • 没错,但我倾向于对充斥着doesRespondToSelector: 调用的代码感到沮丧 - 强制转换虽然不是绝对必要的,但在未来可能会更具可读性。
【解决方案2】:

这似乎是解决问题的一种非常严厉的方法。如果数据加载了不良数据,那么我会强烈建议您在导入数据时修复它。蒂姆的回答将适用于你正在做的事情,但我强烈怀疑你来错了。遍历整个数据库以查找潜在的不良数据非常低效。

【讨论】:

  • 我更同意这种方法,而不是我发布的答案 - 如果您知道“第一次”导入了错误的数据,那么您应该能够在导入时更正它,而不是稍后.
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2013-10-19
    • 1970-01-01
    • 2018-07-15
    • 2015-01-11
    • 2017-12-17
    相关资源
    最近更新 更多