UIManagedDocument - 验证核心数据实体

Posted

技术标签:

【中文标题】UIManagedDocument - 验证核心数据实体【英文标题】:UIManagedDocument - Validating Core Data Entity 【发布时间】:2012-02-03 01:10:22 【问题描述】:

我有一个使用 Core Data 的应用程序,它通过使用 UIManagedObject 获取其 ManagedObjectContext。从阅读中,我发现我不应该直接保存上下文 - 而我应该依赖 UIManagedObject 的自动保存或使用 saveToURL:... 我的问题是我想验证存储在我的实体中的数据。我对实体有约束,指定字符串属性的最小长度为 1。但是,我可以创建一个新对象,为其属性分配空字符串,然后保存文件。在 saveToURL:... 的完成处理程序中,它始终具有真正的成功值。然后,我为我的实体的 name 属性创建了自己的验证器。我使用了 Core Data Programming Guide 中的示例代码 -

-(BOOL)validateName:(id *)ioValue error:(__autoreleasing NSError **)outError 


    if (*ioValue == nil) 

    
        if (outError != NULL) 

        
            NSString *errorStr = @"nil error";

            NSDictionary *userInfoDict = [NSDictionary dictionaryWithObject:errorStr

                forKey:NSLocalizedDescriptionKey];

            NSError __autoreleasing *error = [[NSError alloc] initWithDomain:@"domain"

                code:1

                userInfo:userInfoDict];

            *outError = error;

        

        return NO;

    

    else if( [*ioValue length] == 0 )

    

        if (outError != NULL) 

            NSString *errorStr = @"length error";

            NSDictionary *userInfoDict = [NSDictionary dictionaryWithObject:errorStr

                forKey:NSLocalizedDescriptionKey];

            NSError __autoreleasing *error = [[NSError alloc] initWithDomain:@"domain"

                code:1

                userInfo:userInfoDict];

            *outError = error;

        

        return NO;

    

    else

    

        return YES;

    


当它运行时,我看到 ioValue 的长度为 0 并且它返回 NO,但是我的完成处理程序永远不会被调用。任何帮助都会很棒。

关于如何使用 UIManagedDocument 处理保存错误,我是否缺少一些东西 - 特别是如何通知调用代码在保存其信息时发生错误。

【问题讨论】:

【参考方案1】:

通常,您应该只调用 saveToURL 来创建一个全新的文件。让自动保存完成剩下的工作。

另外,我不确定我是否听懂了你的问题。如果您询问如何知道保存失败,最好的办法是注册通知(因为所有保存都发生在后台线程上)。

直接来自文档:

UIDocument 对象在其生命周期的任何时刻都有特定的状态。您可以通过查询 documentState 属性来检查当前状态。并且您可以通过观察 UIDocumentStateChangedNotification 通知来通知文档状态的变化。

【讨论】:

【参考方案2】:

我想我需要在 UIManagedDocument 的子类中实现handleError:(NSError *)error userInteractionPermitted:(BOOL)userInteractionPermitted。我通过这篇文章发现了 - http://blog.stevex.net/2011/12/uimanageddocument-autosave-troubleshooting/

【讨论】:

以上是关于UIManagedDocument - 验证核心数据实体的主要内容,如果未能解决你的问题,请参考以下文章

在核心数据中使用 UIManagedDocument 的标准(或正确)方法是啥

如何将现有的非文档核心数据存储转换为 uimanageddocument?

iOS使用UIManagedDocument添加初始核心数据文件,而不是appdelegate

可以使用 NSFileManager 处理从 UIManagedDocument 创建的核心数据数据库吗?

在 iOS 5 中使用 UIManagedDocument 和父/子上下文导入核心数据背景

如何覆盖 UIManagedDocument 中的 NSPersistentStoreCoordinator