由于验证规则上下文导致的 iOS 核心数据保存 MOC 问题
Posted
技术标签:
【中文标题】由于验证规则上下文导致的 iOS 核心数据保存 MOC 问题【英文标题】:iOS Core Data Saving MOC issue due to Validation rules context 【发布时间】:2015-03-25 16:27:29 【问题描述】:我将 Magical Record 与 Core Data 框架结合使用,但在从我的 MOC 中保存已删除对象时遇到了问题。我有一个病人 NSManagedObject,它有一组 Notes NSManagedObjects,所以 MO 看起来像这样:
病人.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 用于创建笔记。
【问题讨论】:
【参考方案1】:创建不同的托管对象上下文是解决问题的正确方法。 MOC 是一个“便签本”,在您描述的场景中您需要两个便签本。您实际上是在用另一个笔记编辑过程中断笔记创建过程。
话虽如此,您可以删除空笔记并在其他控制器关闭时重新创建它。您还可以将注释文本设置为@""
。实现这一点的方法有很多种,但使用两个 MOC 是最干净的方法。
【讨论】:
感谢您的回复,我尝试使用两种不同的 MOC,但后来我遇到了“MOC 属于不同的对象”之类的问题,当我创建一个新的使用新上下文记录然后尝试将其保存到患者的笔记列表中,我收到有关上下文不匹配的相同错误。我试过谷歌搜索如何正确合并上下文,你碰巧有关于此事的任何链接吗?再次感谢您。 这很简单,真的,因为在你的情况下,你并没有真正同时做任何事情。使用主上下文的子上下文来处理编辑,然后当你完成时save
,它将更改推送到主上下文,但在你再次保存之前不会持久化。您无需进行合并...如果这看起来太多,请考虑我提到的其他解决方案。
是的,我不能依靠第二次保存来保存已删除的笔记,因为情况并非总是如此,以防他们按下后退按钮并且不想保存任何内容。我目前正在使用一个 hacky 解决方案,并且想使用一种更清洁的方法,所以我想我可能只需要坚持下去。再次感谢您。
我很高兴它能帮助你。如果是这种情况,您应该接受答案。以上是关于由于验证规则上下文导致的 iOS 核心数据保存 MOC 问题的主要内容,如果未能解决你的问题,请参考以下文章