核心数据IOS:如何使用值创建对象而不将其标记为具有更改

时间:2012-05-03 18:31:43

标签: ios core-data initialization nsmanagedobject

我不知道这有多复杂,

我有一个使用CoreData的应用。

当我创建一个新的托管对象时,我使用plist中的默认值填充其字段。

然后我显示了一堆表单(将保存的值加载到表单中,并在我继续时更新对象的值)。

最后,我检查对象是否有变化并建议保存对象。

这部分工作正常。

但是,当用户在界面中点击“返回”时遇到问题。我希望能够在用户更改对象中的任何内容时显示警报,或者如果没有任何更改,则让用户返回。

但是,我会改变,因为我使用默认数据填充对象,CoreData认为对象已经改为开始。

那么如何创建一个新的托管对象并对其进行初始化而不将其视为更改

- (Company *)createNewDefaultCompany:(NSString *)name{
    Company *company = [Company insertInManagedObjectContext:managedObjectContext];
    [company setName:name];
    [company setDate:[NSDate date]];
    [company setLocalisation:@"en_UK"];

    Input *input = [Input insertInManagedObjectContext:managedObjectContext];
    [input populateWithDefault];
    [company setCompanyInputs:input];

    Formulas *formulas = [Formulas insertInManagedObjectContext: managedObjectContext];
    [formulas populateWithDefault];
    [company setCompanyFormula:formulas];

    [company createCalculus];
    return company;
} 

创建托管对象。

+(Company *)insertInManagedObjectContext:(NSManagedObjectContext *)managedObjectContext{
    return (Company *)[NSEntityDescription insertNewObjectForEntityForName:@"Company" inManagedObjectContext:managedObjectContext]; 
}

3 个答案:

答案 0 :(得分:3)

我无法对此进行测试,但您可能会考虑的是在设置company托管对象后保存托管对象上下文,然后在保存后检查更改。要在用户退出时删除新对象,可以在托管上下文中调用deleteObject方法,并将引用传递给新对象。只需确保在删除对象后再次保存上下文。

答案 1 :(得分:0)

一旦可能的方法是在托管对象上下文中使用NSUndoManager。您可以在禁用撤消注册的代码块中包装默认值设置:

- (Company *)createNewDefaultCompany:(NSString *)name{
    [[managedObjectContext undoManager] disableUndoRegistration];

    Company *company = [Company insertInManagedObjectContext:managedObjectContext];
    [company setName:name];
    [company setDate:[NSDate date]];
    [company setLocalisation:@"en_UK"];

    Input *input = [Input insertInManagedObjectContext:managedObjectContext];
    [input populateWithDefault];
    [company setCompanyInputs:input];

    Formulas *formulas = [Formulas insertInManagedObjectContext: managedObjectContext];
    [formulas populateWithDefault];
    [company setCompanyFormula:formulas];

    [company createCalculus];

    [managedObjectContext processPendingChanges];
    [[managedObjectContext undoManager] enableUndoRegistration];

    return company;
} 

然后检查撤消管理器上的canUndo状态。假设此视图控制器中没有可撤消的操作(您可以在进入或退出视图控制器时在撤消管理器上使用-removeAllActions清除此操作),撤消状态应反映在创建和初始化后是否进行了任何更改这个NSManagedObject。

这可能不是最佳解决方案,但是,如果您想在管理对象上下文中使用undo,则需要在创建公司对象之前擦除撤消状态。

答案 2 :(得分:0)

要确保NSManagedObject未标记为已更改,您不应使用普通的setter,而应使用setPrimitiveValue:而不是。 BTW:通常,NSManagedObject初始化是在awakeFromInsert方法中完成的。