我正在使用带有Core Data框架的Magical Record,我遇到了从MOC中保存已删除对象的问题。我有一个患者NSManagedObject,它有一组Notes NSManagedObjects,所以MO看起来像这样:
Patient.h
@interface Patient : NSManagedObject
@property (nonatomic, retain) NSSet *notes;
@end
@interface Patient (CoreDataGeneratedAccessors)
- (void)addNotes:(NSSet *)values;
- (void)removeNotes:(NSSet *)values;
@end
Notes.h
@interface Note : NSManagedObject
@property (nonatomic, retain) NSDate * creationDate;
@property (nonatomic, retain) NSString * noteText;
@property (nonatomic, retain) Patient *patient;
@end
我还有验证规则,以确保noteText属性不为null或为空。现在,在viewDidLoad方法的视图控制器中,我正在使用:
创建一个新的笔记管理对象Note* lNote = [Note MR_createInContext:localContext];
因此,一旦视图加载,就会立即创建注释,准备通过UITextView修改noteText属性。如果用户没有输入任何文本并按下保存验证触发器并阻止保存,这一切都很好。
当我点击同一视图控制器中的我的笔记存档文件夹按钮时出现问题,一旦按下,它就会出现一个模态视图控制器并让用户加载或删除笔记,因为我试图删除一个从这个存档屏幕注意,我必须回滚我在viewDidLoad方法中创建的前一个注释,以便我可以删除注释并保存默认上下文,否则当我尝试保存已删除的对象时,noteText属性的验证规则从MOC开始。
我注意到这更像是一个逻辑或工作流类型的问题,但我想阻止回滚在defaultContext中创建的注释,并且仍然能够使用已删除的注释保存defaultContext。
我尝试过使用不同的MOC,但提出了更多问题,一个用于检索患者的MOC和另一个用于创建笔记的MOC。
答案 0 :(得分:1)
创建不同的托管对象上下文是解决问题的正确方法。 MOC是一个"暂存器"并且在您描述的场景中需要两个刮板。您实际上是通过另一个笔记编辑过程来中断笔记创建过程。
话虽这么说,你可以删除空注释并在其他控制器被解除时重新创建它。您还可以将备注文本设置为@""
。有各种各样的hacky方法来实现这一点,但使用两个MOC是最干净的方法。