我已经通过iPhone OS 3.1.3跟踪iPod Touch上我的应用程序的崩溃用户:由于某种原因,使用CoreData商店中的“@count:”表达式导致崩溃。这是相关的代码:
NSExpression *avgExpression = [NSExpression expressionForFunction:@"average:" arguments:[NSArray arrayWithObject:keyPathExpression]];
NSExpressionDescription *ed = [[NSExpressionDescription alloc] init];
[ed setName:@"avgScalar"];
[ed setExpression:avgExpression];
[ed setExpressionResultType:NSFloatAttributeType];
NSExpression *countExpression = [NSExpression expressionForFunction:@"count:" arguments:[NSArray arrayWithObject:keyPathExpression]];
NSExpressionDescription *ed2 = [[NSExpressionDescription alloc] init];
[ed2 setName:@"countScalar"];
[ed2 setExpression:countExpression];
[ed2 setExpressionResultType:NSInteger16AttributeType];
[request setPropertiesToFetch:[NSArray arrayWithObjects:ed,ed2,nil]];
执行提取时,崩溃时出现以下错误:
*由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'* -constantValue仅为抽象类定义。定义 - [NSKeyPathExpression constantValue]!'
如果我将获取限制为avgExpression(@“average:”),则一切正常。关于@“count:”表达式有一些不足之处,据我所知,只能在iPod Touch上使用iPhone OS 3.1.3。有什么想法吗?
我可以交替执行完全获取并使用关键路径运算符来获取我需要的平均值和计数。但是,我担心这种方法会更加昂贵。任何人都知道它是不是?
答案 0 :(得分:0)
这是我能找到的旧操作系统的最佳解决方案,只有很小的性能。
清除请求的表达式部分:
[request setPropertiesToFetch:nil]; [request setResultType:NSManagedObjectResultType];
执行仅计数提取:
[managedObjectContext countForFetchRequest:request error:&error];
从解决这个问题可以清楚地看出,CoreData的内部已经从iOS 3变为iOS 4.例如,你可以通过NSLog在两个操作系统中看到一个以属性为中心的NSFetchRequest对象。