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
,并对代码重新排序,使其在创建对象之前执行检查。然而,它仍然没有节约。