应用程序使用核心数据崩溃

时间:2013-03-04 08:06:52

标签: iphone ios core-data crash nsnumber

我正在使用核心数据来保存数据。我的应用程序第一次保存数据没有任何问题,但第二次应用程序在崩溃日志[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;
}

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

嗨,我刚刚遇到这个问题。我在左侧滑动时将问题设置为0%,在右侧滑动时设置为100%。在核心数据中,我有属性compliancePercentage的NSNumber数据类型。

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

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

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");
}

希望这有助于