Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/118.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 无法将对象保存到CoreData_Ios_Core Data - Fatal编程技术网

Ios 无法将对象保存到CoreData

Ios 无法将对象保存到CoreData,ios,core-data,Ios,Core Data,我有一个数据模型,实体为HYUser,属性为firstName,lastName,email,gender和phone。当我检查我的.sqliteDB时,什么都没有。我已经附加了应该保存对象的整个按钮操作 - (IBAction)btnUserDataSave:(id)sender { NSEntityDescription * entityDescription = [NSEntityDescription entityForName:@"HYUser" inManagedObjectCont

我有一个数据模型,实体为
HYUser
,属性为
firstName
lastName
email
gender
phone
。当我检查我的
.sqlite
DB时,什么都没有。我已经附加了应该保存对象的整个按钮操作

- (IBAction)btnUserDataSave:(id)sender {
NSEntityDescription * entityDescription = [NSEntityDescription entityForName:@"HYUser" inManagedObjectContext:context];
NSManagedObject *newUser = [[NSManagedObject alloc]initWithEntity:entityDescription insertIntoManagedObjectContext:context];
NSString *gender = NULL;
NSError *error = nil;

[newUser setValue:self.txtfFirstName.text forKey:@"firstName"];
[newUser setValue:self.txtfLastName.text forKey:@"lastName"];
[newUser setValue:self.txtfPhoneNumber.text forKey:@"phone"];
[newUser setValue:self.txtfUserEmail.text forKey:@"email"];

if (self.segmentControlGender.selectedSegmentIndex == 0) {
    gender = @"Male";
}else if(self.segmentControlGender.selectedSegmentIndex == 1){
    gender = @"Female";
}else{
    NSLog(@"ERROR in gender saving");
}
[newUser setValue:gender forKey:@"gender"];

if ([self.txtfFirstName.text  isEqual: @""] || [self.txtfLastName.text  isEqual: @""] || [self.txtfPhoneNumber.text  isEqual: @""] || [self.txtfUserEmail.text  isEqual: @""]) {
    UIAlertController* errorPrompt = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Required Fields", @"Required Fields")
                                                                         message:NSLocalizedString(@"All fields are required to complete Sign-up. ", nil)
                                                                  preferredStyle:UIAlertControllerStyleAlert];
    UIAlertAction* okAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"OK",nil)
                                                       style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {

                                                       }];
    [errorPrompt addAction:okAction];
    [self presentViewController:errorPrompt animated:YES completion:NULL];

}else{
    if(![context save:&error]) {
        self.labelStatus.text = @"Error";
        NSLog(@"%@, %@", error, error.localizedDescription);
    }else{
        [context save:&error];
        self.labelStatus.text = @"Saved";

    }
}
}

尝试从核心数据取回对象,以确保它没有进入

您可以试试这个,而不是initWithEntity

[NSEntityDescription insertNewObjectForEntityForName:@"HYUser" inManagedObjectContext:context];
您保存了两次上下文,如果第一次保存成功,则第二次保存。这不会引起问题,但不需要

此外,如果用户未通过字段验证,则表示您已经在上下文中创建了对象。这是需要的还是应该在创建托管对象之前进行验证?

要检查的事项:

context
nil,还是它真的指向了
NSManagedObjectContext
?它是如何产生的?它是否有一个持久的存储协调器

是否有任何中间对象为零?
entityForName:
参数中的输入错误将导致插入失败。也许可以添加
nsParameterAssert(新用户)
。如果爆炸了,你知道要回溯并找出原因

还有

您在代码中使用文本键串是在请求一个静默运行时错误。拼写错误不会被编译器捕获。用符号定义字符串。更好的是,创建您自己的自定义NSManagedObject子类,您可以使用常规setter/getter,而不是
valueForKey:

如果第一次调用失败,您将在上下文中再次调用
-save:
。这不太可能有帮助。考虑将<代码>错误。本地化的描述< /代码>进入您的代码> LabelSturt.Text <代码>,而不是“错误”一词。


我可能会测试各个字段中的文本长度是否大于0,而不是与
@“
进行比较。它更短,更容易阅读。另请参阅,以了解选择isEqualToString的几个原因:

除了Hal Mueller的检查事项列表之外,我还想添加

如果我要检查
isEqual:@“
在大多数情况下,我还要检查
isEqual:nil

用你的例子

if ([self.txtfFirstName.text isEqual: @""] || 
    [self.txtfFirstName.text isEqual: nil] || 
    [self.txtfLastName.text isEqual: @""] || 
    [self.txtfLastName.text isEqual: nil] || 
    [self.txtfPhoneNumber.text isEqual: @""] || 
    [self.txtfPhoneNumber.text isEqual: nil] || 
    [self.txtfUserEmail.text isEqual: @""] || 
    [self.txtfUserEmail.text isEqual: nil]) {

我解决了这个问题,看起来这与我试图保存对象的方式有关。下面是我注册新用户的全部代码

- (IBAction)btnUserDataSave:(id)sender {


HYUser* signUpUserObject = [NSEntityDescription insertNewObjectForEntityForName:@"HYUser" inManagedObjectContext:context];

NSString *gender = nil;
NSError *error = nil;

if ([self.txtfFirstName.text  isEqual: @""] || [self.txtfLastName.text  isEqual: @""] || [self.txtfPhoneNumber.text  isEqual: @""] || [self.txtfUserEmail.text  isEqual: @""]) {
    UIAlertController* errorPrompt = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Required Fields", @"Required Fields")
                                                                         message:NSLocalizedString(@"All fields are required to complete Sign-up. ", nil)
                                                                  preferredStyle:UIAlertControllerStyleAlert];
    UIAlertAction* okAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"OK",nil)
                                                       style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {

                                                       }];
    [errorPrompt addAction:okAction];
    [self presentViewController:errorPrompt animated:YES completion:NULL];

}
else {


    self.labelStatus.text = @"Saved";
    [signUpUserObject setValue:self.txtfFirstName.text forKey:@"firstName"];
    [signUpUserObject setValue:self.txtfLastName.text forKey:@"lastName"];
    [signUpUserObject setValue:self.txtfPhoneNumber.text forKey:@"phone"];
    [signUpUserObject setValue:self.txtfUserEmail.text forKey:@"email"];

    gender =  self.segmentControlGender.selectedSegmentIndex == 0 ? @"Male" : @"Female";

    [signUpUserObject setValue:gender forKey:@"gender"];

    if(![context save:&error]) {
        self.labelStatus.text = @"Error";
        NSLog(@"%@, %@", error, error.localizedDescription);
    }
    else {
        UIAlertController* errorPrompt = [UIAlertController alertControllerWithTitle:@"HairYourWay"
                                                                             message:NSLocalizedString(@"STR_NEW_USER_SIGN_UP_SUCCEEDED", @"Success")
                                                                      preferredStyle:UIAlertControllerStyleAlert];
        UIAlertAction* okAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"OK",nil)
                                                           style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
                                                               [self.navigationController popViewControllerAnimated:YES];
                                                           }];
        [errorPrompt addAction:okAction];
        [self presentViewController:errorPrompt animated:YES completion:NULL];

    }
}
}

我更改了代码以反映托管对象上下文中的
inManagedObjectContext:context
,并对代码重新排序,使其在创建对象之前执行检查。然而,它仍然没有节约。