核心数据:deleteObject 使应用程序崩溃,NSPredicate 是啥原因?

Posted

技术标签:

【中文标题】核心数据:deleteObject 使应用程序崩溃,NSPredicate 是啥原因?【英文标题】:Core Data: deleteObject crashes application, NSPredicate the cause?核心数据:deleteObject 使应用程序崩溃,NSPredicate 是什么原因? 【发布时间】:2013-06-02 10:49:46 【问题描述】:

我正在使用 UICollectionView 和 Core Data。

我似乎无法弄清楚为什么我不能从 Core Data 中删除对象。它在[self.managedObjectContext deleteObject:animation]; 处崩溃并出现index 0 beyond bounds for empty array 错误。以下方法是从另一个视图控制器调用的委托方法。它获取一个时间戳 NSInteger,并应该使用该时间戳创建一个 NSPredicate。

奇怪的是,当我使用 animationTimestamp NSInteger 并对其进行硬编码时: [NSPredicate predicateWithFormat:@"timestamp == %i", @"1370169109"] 它可以工作,并且该对象被删除而没有错误。但是,当我想将参数作为参数传递时,它会崩溃。我已经尝试将其设为字符串、NSNumber 等。当我获取参数时没有任何作用,只有在我对其进行硬编码时才会起作用。我已经记录了 animationTimestamp 并且它显示了正确的值,所以我被卡住了。

谢谢!

- (void)deleteAnimationWithTimestamp:(NSInteger)animationTimestamp 

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Animations" inManagedObjectContext:self.managedObjectContext];

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"timestamp == %i", animationTimestamp];
    [fetchRequest setPredicate:predicate];

    [fetchRequest setEntity:entity];
    NSError *error;

    NSArray *animations = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];

    for (NSManagedObject *animation in animations) 
        [self.managedObjectContext deleteObject:animation];
    

    // Save core data
    if (![self.managedObjectContext save:&error]) 
        NSLog(@"Couldn't save: %@", [error localizedDescription]);
    

    [self.animationsCollectionView reloadData];

编辑: 更多可能重要的信息。模型中的timestamp属性是一个64位的整数(应该是顺便吧?)。当我创建我使用的对象时:

NSNumber *timestampNumber = [NSNumber numberWithInt:timestamp];
[newAnimation setValue:timestampNumber forKey:@"timestamp"];

【问题讨论】:

您的对象是否与任何其他实体有关系依赖关系? 尝试将谓词中的 %i 更改为 %d @kushyar 我只有一个实体,动画。 @verbumdei 不幸的是,我已经尝试过 %i, %d, %@。 对值进行硬编码时所做的事情与不对其进行硬编码时不同。当您对值进行硬编码时,您将发送一个 NSString 作为参数,而当您不对其进行硬编码时,您将发送一个 NSInteger。正如@verbumdei 所说,将 %i 更改为 %d 【参考方案1】:

从 NSNumber 获取 NSInteger 值 喜欢

NSInteger timestampNumber = [[NSNumber numberWithInt:timestamp] integerValue];
// then use this integer 

[newAnimation setValue:timestampNumber forKey:@"timestamp"];

// or in 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"timestamp == %d", timestampNumber];

【讨论】:

以上是关于核心数据:deleteObject 使应用程序崩溃,NSPredicate 是啥原因?的主要内容,如果未能解决你的问题,请参考以下文章

崩溃:commitEditingStyle -deleteObject 为零

带有 EXC_BAD_ACCESS 的 Core Data deleteObject 应用程序崩溃

UITableView中的deleteObject错误,无法复制

Xcode 6 Beta 在 iPad 7.1 上运行时使用核心数据使应用程序崩溃

Restkit Core Data 映射崩溃应用程序

核心情节使我的应用程序使用仪器崩溃