【问题标题】:Application crashes using core data使用核心数据的应用程序崩溃
【发布时间】:2013-03-04 08:06:51
【问题描述】:

我正在使用核心数据来保存数据。我的应用程序第一次保存数据没有任何问题,但第二次应用程序在 [self.managedObjectContext save:nil]; 行崩溃并显示崩溃日志

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFNumber localizedCaseInsensitiveCompare:]: unrecognized selector sent to instance 0x98dda90'
*** First throw call stack:
(0x1e6e012 0x179ee7e 0x1ef94bd 0x1e5dbbc 0x1e5d94e 0xeeae92 0xf645ee 0x15ca8f5 0x15c5785 0x15c8061 0xf53dc9 0x1ec80c5 0x1e22efa 0xe88482 0x14da5f3 0x1573e5f 0x14d5a26 0x14d916e 0x77ca 0x7d4e 0x17b2705 0x3dd920 0x619b24 0x17b2705 0x3dd920 0x3dd8b8 0x49e671 0x49ebcf 0x49dd38 0x40d33f 0x40d552 0x3eb3aa 0x3dccf8 0x1dc9df9 0x1dc9ad0 0x1de3bf5 0x1de3962 0x1e14bb6 0x1e13f44 0x1e13e1b 0x1dc87e3 0x1dc8668 0x3da65c 0x3efd 0x2425)
libc++abi.dylib: terminate called throwing an exception

我正在使用以下代码来保存数据

- (IBAction)save:(id)sender {
    Projects *projects = [NSEntityDescription insertNewObjectForEntityForName:@"Projects" inManagedObjectContext:self.managedObjectContext];
    NSLog(@"object id %@", projects.objectID);
    projects.title = projectTitleTxtFld.text;
    projects.descProject = descriptionTxtView.text;
    projects.type = projectType.text;
    projects.recID = [self generateRandom];
    NSLog(@"rec id %@", projects.recID);
    [self.managedObjectContext save:nil]; //here my app crashes
    NSLog(@"title %@", projects.title);
 }

-(NSNumber*)generateRandom
{
    int number = arc4random();
    if (number < 0) {
        number = number * -1;
    }
    NSNumber *newNumber = [NSNumber numberWithInt:number];
    return newNumber;
}

【问题讨论】:

  • 数据模型中的 projects.recID 是否与 -[self generateRandom] 的类型相同?
  • 这个异常听起来像是你已经将 NSNumber 设置为 NSString 属性并尝试排序/比较...
  • @RolandasR projects.recID 是 NSNumber 类型
  • @Mert projects.recID 是 NSNumber 类型,我正在尝试为其分配一个 NSNumber。我已经编辑了你可以检查我的“GenrateRandom”方法的代码
  • GenerateRandom 方法看起来没问题。我对项目类型持怀疑态度。但是,在我尝试猜测哪种属性类型错误之前,您能否将您的属性添加到您的问题中。请同时检查您的 coredata 模型中的数据类型。

标签: iphone ios core-data crash nsnumber


【解决方案1】:

实际上是因为您尝试插入核心数据的数据类型错误。 从错误日志中,我觉得有一些数字分配给了 coredata 属性,它是一个字符串。 请检查您使用

插入的所有数据
NSLog(@"class %@",[object class]);

并检查你插入的核心数据字段数据类型和对象数据类型是否相同

【讨论】:

    【解决方案2】:

    您好,我刚刚遇到了这个问题。我将问题设置为在左滑动时 0% 兼容,在右滑动时设置为 100%。在核心数据中,我有一个属性 compliantPercentage 的 NSNumber 数据类型。

    我使用 [NSNumber numberWithInt:100] 将一个简单的 int 数字包装到 NSNumber 中

    我的视图是一个带有核心数据的表格视图控制器,因此是获取的结果控制器。代码sn-p是:

    CheckSectionQuestion *theQuestion;
    theQuestion = [self.fetchedResultsController objectAtIndexPath:indexPath];
    theQuestion.compliantPercentage=[NSNumber numberWithInt:100];
    theQuestion.completed=[NSNumber numberWithBool:YES];
    

    现在,虽然这会更新表格视图并且看起来它已经更新了核心数据,但有些事情没有奏效。如果我使用导航控制器返回上一个视图控制器,然后再返回此视图控制器解决任何问题 - 不仅仅是我刚刚更新的那个,我会收到您提到的错误。

    解决方案?

    非常简单 - 显式保存更改。

    CheckSectionQuestion *theQuestion;
    theQuestion = [self.fetchedResultsController objectAtIndexPath:indexPath];
    
    theQuestion.compliantPercentage=[NSNumber numberWithInt:100];
    theQuestion.completed=[NSNumber numberWithBool:YES];
    
    //***** make sure CD saves the changes
    NSError * error;
    if ([theQuestion.managedObjectContext  save:&error]) {
          NSLog(@"saved");
    }
    

    希望这会有所帮助

    【讨论】:

    • 请注意 - 我已经检查了数据类型等它们都是正确的,明确保存数据是我对代码所做的唯一更改以阻止它崩溃
    猜你喜欢
    • 1970-01-01
    • 2011-08-24
    • 1970-01-01
    • 2011-01-28
    • 2019-10-05
    • 2011-10-06
    • 1970-01-01
    • 2011-01-10
    • 1970-01-01
    相关资源
    最近更新 更多