iOS 由于验证规则上下文导致核心数据保存 MOC 问题
iOS Core Data Saving MOC issue due to Validation rules context
我将 Magical Record 与 Core Data 框架一起使用,并且我 运行 遇到了从我的 MOC 中保存已删除对象的问题。我有一个 Patient 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 修改注释文本 属性。如果用户没有输入任何文本并按下保存验证触发器并阻止保存,这一切都很好。
当我单击同一个视图控制器中的我的笔记存档文件夹按钮时出现问题,按下后,它会显示一个模态视图控制器并允许用户加载或删除笔记,因为我正在尝试从此存档屏幕中删除一条注释,我必须回滚我在 viewDidLoad 方法中创建的先前注释,以便我可以删除注释并保存默认上下文,否则当我尝试保存已删除对象时的验证规则noteText 属性 从 MOC 开始。
我注意到这更像是一个逻辑或工作流程类型的问题,但我想防止回滚在 defaultContext 中创建的笔记,并且仍然能够使用已删除的笔记保存 defaultContext。
我试过使用不同的 MOC,但出现了更多问题,一个 MOC 用于检索患者,另一个 MOC 用于创建笔记。
创建不同的托管对象上下文是解决您的问题的正确方法。 MOC 是 "scratchpad",在您描述的场景中您需要两个暂存器。您实际上是在用另一个笔记编辑过程打断笔记创建过程。
话虽这么说,您可以删除空笔记并在其他控制器被解雇时重新创建它。您还可以将注释文本设置为 @""
。有各种各样的 hacky 方法可以实现这一点,但使用两个 MOC 是最干净的方法。
我将 Magical Record 与 Core Data 框架一起使用,并且我 运行 遇到了从我的 MOC 中保存已删除对象的问题。我有一个 Patient 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 修改注释文本 属性。如果用户没有输入任何文本并按下保存验证触发器并阻止保存,这一切都很好。
当我单击同一个视图控制器中的我的笔记存档文件夹按钮时出现问题,按下后,它会显示一个模态视图控制器并允许用户加载或删除笔记,因为我正在尝试从此存档屏幕中删除一条注释,我必须回滚我在 viewDidLoad 方法中创建的先前注释,以便我可以删除注释并保存默认上下文,否则当我尝试保存已删除对象时的验证规则noteText 属性 从 MOC 开始。
我注意到这更像是一个逻辑或工作流程类型的问题,但我想防止回滚在 defaultContext 中创建的笔记,并且仍然能够使用已删除的笔记保存 defaultContext。
我试过使用不同的 MOC,但出现了更多问题,一个 MOC 用于检索患者,另一个 MOC 用于创建笔记。
创建不同的托管对象上下文是解决您的问题的正确方法。 MOC 是 "scratchpad",在您描述的场景中您需要两个暂存器。您实际上是在用另一个笔记编辑过程打断笔记创建过程。
话虽这么说,您可以删除空笔记并在其他控制器被解雇时重新创建它。您还可以将注释文本设置为 @""
。有各种各样的 hacky 方法可以实现这一点,但使用两个 MOC 是最干净的方法。