自定义验证期间神奇记录核心数据中的上下文保存问题

Posted

技术标签:

【中文标题】自定义验证期间神奇记录核心数据中的上下文保存问题【英文标题】:Context Saving issue in Magical record Core data during custom validation 【发布时间】:2014-09-16 07:12:30 【问题描述】:

我创建了一个名为“Person”的实体。 以下是实体的属性。

@property (nonatomic, retain) NSString * address;
@property (nonatomic, retain) NSString * confirmPassword;
@property (nonatomic, retain) NSString * createdOn;
@property (nonatomic, retain) NSString * email;
@property (nonatomic, retain) NSString * fbId;
@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) NSString * password;
@property (nonatomic, retain) NSString * phNumber;
@property (nonatomic, retain) NSString * sessionToken;

自定义验证添加在两个属性“confirmPassword”和“password”上,如:

- (BOOL)validatePassword:(id *)ioValue error:(NSError **)outError 

    // Password's validation is not specified in the model editor, it's specified here.
    // field width: min 4, max 32

    BOOL isValid = YES;
    NSString *password = *ioValue;
    NSString *errorMessage;
    NSInteger code = 0;

    if (password.length == 0) 

        errorMessage = @"Please enter password.";
        code = NSValidationMissingMandatoryPropertyError;
        isValid = NO;

     else if (password.length < 4) 

        errorMessage = @"Password can't be less than 4 characters.";
        code = NSValidationStringTooLongError;
        isValid = NO;

     else if (password.length > 32) 

        errorMessage = @"Password can't be more than 32 characters.";
        code = NSValidationStringTooLongError;
        isValid = NO;

    

    if (outError && errorMessage) 
        NSDictionary *userInfo = @ NSLocalizedDescriptionKey : errorMessage ;
        NSError *error = [[NSError alloc] initWithDomain:kHAB
                                                    code:code
                                                userInfo:userInfo];
        *outError = error;
    

    return isValid;



- (BOOL)validateConfirmPassword:(id *)ioValue error:(NSError **)outError 

    // Confirm Password's validation is not specified in the model editor, it's specified here.
    // field validation
    BOOL isValid = YES;
    NSString *confirmPassword = *ioValue;
    NSString *errorMessage;
    NSInteger code = 0;
    if (![confirmPassword isEqualToString:self.password]) 
        errorMessage = @"The passwords must match";
        code = NSValidationStringPatternMatchingError;
        isValid = NO;
    
    if (outError && errorMessage) 
        NSDictionary *userInfo = @ NSLocalizedDescriptionKey : errorMessage ;
        NSError *error = [[NSError alloc] initWithDomain:kHAB
                                                    code:code
                                                userInfo:userInfo];
        *outError = error;
    
    return isValid;

值被保存在 Person 实体中,例如:

Person  *userProfile = [Person MR_createEntity];
NSString *facebookId = @"some id";
[userProfile setFbId:facebookId];
[userProfile setEmail:@"umairsuraj.engineer@gmail.com"];
[[NSManagedObjectContext MR_defaultContext] MR_saveToPersistentStoreAndWait];

无法保存上下文,说明人员实体未通过有效的密码验证并确认密码字段。从 Facebook 注册期间,我不需要输入密码和确认密码字段。我应该怎么做才能保存上下文而不保存“密码”和“确认密码”的值?

【问题讨论】:

password 和 confirmPassword 是必填字段还是可选字段? 两个字段都是可选的... 【参考方案1】:

看起来很简单:

您的课程Person 包括passwordconfirmPassword 字段的验证方法。这些方法不接受 nil 值。 您创建了Person 的实例,但没有为password 设置值。因此,新实例的该字段值为 nil。 您尝试保存更改。

简而言之,验证失败是因为您自己的验证码要求验证失败。要通过验证,您必须为 password 分配一个有效值(其中“有效”表示您的代码将接受的内容)或更改验证码以使 nil 值通过验证。

目前尚不清楚 Facebook 与这个问题有什么关系。您的代码中似乎没有任何内容与 Facebook 有任何关系。

【讨论】:

以上是关于自定义验证期间神奇记录核心数据中的上下文保存问题的主要内容,如果未能解决你的问题,请参考以下文章

如何在保存到核心数据之前验证上下文中的值

Acumatica:触发器在另一个自定义按钮上保存验证

神奇的记录 - 上下文(不保存)

在数据迁移期间删除实体中的所有记录

由于验证规则上下文导致的 iOS 核心数据保存 MOC 问题

如何将查询更改为核心数据(神奇记录)中的获取结果?