Core Data 的 Save 方法第一次调用“nil” - 为啥?

Posted

技术标签:

【中文标题】Core Data 的 Save 方法第一次调用“nil” - 为啥?【英文标题】:Save method for Core Data calls "nil" the first time - Why?Core Data 的 Save 方法第一次调用“nil” - 为什么? 【发布时间】:2011-04-19 06:39:34 【问题描述】:

我目前正在开发一个核心数据调查应用程序。现在,在程序首次创建核心数据实体后保存它时,我的程序遇到了问题。我有一个“else”语句,在我第一次保存时调用它。值已保存,但应用程序崩溃。然后我可以重新启动应用程序,并且 NSManagedObject 可以正常工作。问题出在我的 else 语句中,但我不知道出了什么问题。

代码如下:

- (IBAction)save:(id)sender 
  if (rootController != nil) 
    if (team != nil) 
      [team setValue:name.text forKey:@"name"]; //UITextfield -> NSString
      [team setValue:teamNumber.text forKey:@"teamNumber"]; //UITextfield -> NSString
      [team setValue:[NSNumber numberWithInt:totalRank] forKey:@"totalRankValue"]; //Int -> NSNumber
      [team setValue:driveTrain.text forKey:@"driveTrain"]; //UITextfield -> NSString
      [team setValue:[NSNumber numberWithInt:autonomousRank] forKey:@"autonomousRankValue"]; //Int -> NSNumber
      [team setValue:[NSNumber numberWithInt:robotSpeedRank] forKey:@"robotSpeedRankValue"]; //Int -> NSNumber
      [team setValue:[NSNumber numberWithInt:minibotRank] forKey:@"minibotSpeedRankValue"]; //Int -> NSNumber
      [team setValue:[NSNumber numberWithInt:grabberRank] forKey:@"grabberRankValue"]; //Int -> NSNumber

      [rootController saveContext];

      NSLog(@"Save works - team is not nil");
      //Begin debug

      NSError* error;
      if(![[team managedObjectContext] save:&error]) 
        NSLog(@"Failed to save to data store: %@", [error localizedDescription]);
        NSArray* detailedErrors = [[error userInfo] objectForKey:NSDetailedErrorsKey];
        if(detailedErrors != nil && [detailedErrors count] > 0) 
          for(NSError* detailedError in detailedErrors) 
            NSLog(@"  DetailedError: %@", [detailedError userInfo]);
          
        
        NSLog(@"  %@", [error userInfo]);

      

      //End debug
     
    else 
      [rootController insertTeamWithName:name.text 
                              teamNumber:teamNumber.text
                              driveTrain:driveTrain.text
                     autonomousRankValue:[NSNumber numberWithInt:autonomousRank]
                        grabberRankValue:[NSNumber numberWithInt:grabberRank]
                   minibotSpeedRankValue:[NSNumber numberWithInt:minibotRank] 
                     robotSpeedRankValue:[NSNumber numberWithInt:robotSpeedRank]
                          totalRankValue:[NSNumber numberWithInt:totalRank]]; 

      NSLog(@"Team is nil");

      //Begin debug

      NSError* error;
      if(![[team managedObjectContext] save:&error]) 
        NSLog(@"Failed to save to data store: %@", [error localizedDescription]);
        NSArray* detailedErrors = [[error userInfo] objectForKey:NSDetailedErrorsKey];
        if(detailedErrors != nil && [detailedErrors count] > 0) 
          for(NSError* detailedError in detailedErrors) 
            NSLog(@"  DetailedError: %@", [detailedError userInfo]);
          
        
        else 
          NSLog(@"  %@", [error userInfo]);
        
      

      //End debug


    
  
  [self dismissModalViewControllerAnimated:YES];

非常感谢任何帮助。

谢谢,

凯文

【问题讨论】:

我认为包含崩溃的详细信息也会有所帮助。 【参考方案1】:

由于我缺乏有关错误的详细信息,我猜想问题出在这个条件上:

if (team != nil) 
//...
else
//..
    if(![[team managedObjectContext] save:&error]) 
         //...

您正在从team 对象获取 managedObjectContext,即使该代码行仅在team==nil 时被调用。这意味着调用总是真的:

if(![[nil managedObjectContext] save:&error]) 

...这永远不会起作用。

【讨论】:

首次创建新的 managedObjectContext 团队时,将其设置为 nil 并调用 'else'。团队保存一次后,程序只使用'if'语句,绝不应该调用'else'语句。只要我坚持使用 NSString,else 语句就可以工作,但是当我使用 NSNumber 时程序会崩溃。至于有关错误的详细信息,您对从调试器中检索该信息有什么建议吗?谢谢! 我的错,我意识到我从来没有改写过这个问题。它应该更像是“如何正确保存新的 managedObjectContext”。在写题的过程中解决了我的几个问题XD

以上是关于Core Data 的 Save 方法第一次调用“nil” - 为啥?的主要内容,如果未能解决你的问题,请参考以下文章

Elixir GenServer handle_cast 未被调用

Core Data Save 返回 False,但 Error 为零

spring spring data jpa save操作事务

我是不是通过在启动时获取一个对象并在我想要持久化数据时调用 save 来正确使用 Core Data?

将 Core Data XML 存储同步到磁盘

Spring Batch/Data JPA 应用程序在调用 JPA 存储库(save、saveAll)方法时不会将数据持久化/保存到 Postgres 数据库