【问题标题】:NSSortDescriptor for NSFetchRequestController causes crash when value of sorted attribute is changedNSFetchRequestController 的 NSSortDescriptor 在排序属性的值更改时导致崩溃
【发布时间】:2010-02-09 16:06:37
【问题描述】:

我有一个具有许多属性的核心数据实体,包括数量(浮点数)、类别总(浮点数)和类别(字符串)

初始 ViewController 使用 FethchedResultsController 来检索实体,并根据类别对它们进行排序,然后是 categoryTotal。到目前为止没有问题。

NSManagedObjectContext *moc = [self managedObjectContext];
NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Transaction" inManagedObjectContext:moc];
NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
[request setEntity:entityDescription];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(dateStamp >= %@) AND (dateStamp =< %@)", startDate, endDate];
[request setPredicate:predicate];

NSSortDescriptor *sortByCategory = [[NSSortDescriptor alloc] initWithKey:@"category" ascending:sortOrder];
NSSortDescriptor *sortByTotals = [[NSSortDescriptor alloc] initWithKey:@"categoryTotal" ascending:sortOrder];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortByTotals, sortByCategory, nil];
[request setSortDescriptors:sortDescriptors];

NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:managedObjectContext sectionNameKeyPath:@"category" cacheName:nil];
aFetchedResultsController.delegate = self;
self.fetchedResultsController = aFetchedResultsController;

在选择一行时(tableView:didSelectRowAtIndexPath),另一个视图控制器被加载,允许编辑所选实体的金额字段。

在返回第一个视图之前,categoryTotal 被新的“金额”更新。当返回到第一个视图控制器时,问题就来了,应用程序炸弹

严重的应用程序错误。在核心数据更改处理期间捕获到异常:无效更新:第 0 节中的行数无效。更新后现有节中包含的行数 (1) 必须等于更新前该节中包含的行数(1),加上或减去从该部分插入或删除的行数(0 插入,1 删除)。与用户信息(空) 节目接收信号:“EXC_BAD_ACCESS”。

这似乎是由 NSSortDescriptor *sortByTotals = [[NSSortDescriptor alloc] initWithKey:@"categoryTotal" ascending:sortOrder]; 如果我删除它,一切都会按预期工作,但显然没有我想要的排序。

我猜这与由于 categoryTotal 更改(删除/插入)而导致的排序顺序更改有关,但无法解决此问题。我已经验证了在第二个视图中正确地修改了值,所以它似乎是 fetchedResultsController 被混淆了。如果categoryAmount改成不改变排序顺序的,则不会产生错误

我并没有实际更改(即删除)fetchedResultsController 返回的项目数......我能找到的唯一其他问题似乎会产生此错误

欢迎任何想法

谢谢,AJ

【问题讨论】:

    标签: iphone iphone-sdk-3.0 core-data nsfetchedresultscontroller nssortdescriptor


    【解决方案1】:

    通过 sectionNameKeyPath 对托管对象的排序必须与通过主要排序描述符对托管对象的排序相匹配。由于您使用“category”作为您的 sectionNameKeyPath 并且使用“categoryTotal”作为您的主要排序描述符,因此 sectionNameKeyPaths 与主要排序描述符具有相同的顺序并不普遍。删除 sortByTotals 解决问题的原因是,“类别”同时成为 sectionNameKeyPath 和主要排序描述符,因此它们具有相同的顺序。

    【讨论】:

      【解决方案2】:

      尝试将您在 NSFetchedResultsController 中的排序更改为首先按类别排序,然后按 categoryTotal。这应该可以解决问题。如果没有,请发布您的 NSFetchedResultsController 委托方法。

      【讨论】:

        【解决方案3】:

        如果categoryTotal 是一个临时属性,您不能使用提取请求按此属性排序。您需要手动(通过代码)将 fetchedObjects 排序到可以在表中使用的第二个数组中。

        【讨论】:

        • categoryTotal 不是暂时的。因此,据我估计,控制器应该对获取结果进行排序
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多