在我的存储类型从
NSXMLStoreType
切换到NSSQLiteStoreType
后,我才能让代码正常工作,但是它总是返回相同的值,即使我插入了更高的值。但是,在退出并重新打开应用程序后,它将使用新的插入进行更新。因此,我开始在每次插入后提交和保存数据。但是,在第一次“自动保存”后,我会收到以下错误消息(连续两次): -[NSCFNumber count]: unrecognized selector sent to instance 0x100506a20 这个错误发生在我执行一次获取请求时。
NSArray *objects = [context executeFetchRequest:request error:&error];
更新
我使用了Zombies工具检测我的代码,并查看了产生错误的对象。调用malloc
进行分配的方法是:-[NSUserDefaults(NSUserDefaults) initWithUser:]
。由于我没有设置自己的默认值,所以我不知道这可能是什么对象。
更新2
我在我的所有代码中搜索了"release"并注释掉了每一个静态分析器没有抱怨的release
或autorelease
。我仍然得到错误。我甚至评论掉了我代码中的每一个release
/autorelease
,但仍然得到相同的错误。现在我相当确定我的代码没有过度释放。
更新3
此帖子似乎遇到了相同的问题,但他的解决方案并不合理。他将结果类型从NSDictionaryResultType
更改为NSManagedObjectResultType
,这会产生错误的结果。它返回我的实体类中的每个对象,而不是我正在寻找的单个值(max
)。
以下是堆栈跟踪的最高级别(当我在异常上中断时,第一次出现):
#0 0x7fff802e00da in objc_exception_throw
#1 0x7fff837d6110 in -[NSObject(NSObject) doesNotRecognizeSelector:]
#2 0x7fff8374e91f in ___forwarding___
#3 0x7fff8374aa68 in __forwarding_prep_0___
#4 0x7fff801ef636 in +[_NSPredicateUtilities max:]
#5 0x7fff800d4a22 in -[NSFunctionExpression expressionValueWithObject:context:]
#6 0x7fff865f2e21 in -[NSMappedObjectStore executeFetchRequest:withContext:]
#7 0x7fff865f2580 in -[NSMappedObjectStore executeRequest:withContext:]
我在网上的许多论坛上看到了这个问题,但是没有人提供可行的解决方案。应广大用户要求,我在下面添加了我的代码。稍微解释一下,我的实体名称是 Box
,我试图获取其值的属性是“sortOrder”,一个 Int 32
属性。
NSManagedObjectContext *context = [MyLibrary managedObjectContext];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:[NSEntityDescription entityForName:@"Box"
inManagedObjectContext:context]];
// Specify that the request should return dictionaries.
[request setResultType:NSDictionaryResultType];
// Create an expression for the key path.
NSExpression *keyPathExpression = [NSExpression expressionForKeyPath:@"sortOrder"];
// Create an expression to represent the function you want to apply
NSExpression *expression = [NSExpression expressionForFunction:@"max:"
arguments:[NSArray arrayWithObject:keyPathExpression]];
// Create an expression description using the minExpression and returning a date.
NSExpressionDescription *expressionDescription = [[NSExpressionDescription alloc] init];
// The name is the key that will be used in the dictionary for the return value.
[expressionDescription setName:@"maxSort"];
[expressionDescription setExpression:expression];
[expressionDescription setExpressionResultType:NSInteger32AttributeType];
// Set the request's properties to fetch just the property represented by the expressions.
[request setPropertiesToFetch:[NSArray arrayWithObject:expressionDescription]];
// Execute the fetch.
NSError *error;
NSNumber *requestedValue = nil;
NSArray *objects = [context executeFetchRequest:request error:&error];
NSLog( @"objects: %@", objects );
if (objects != nil && [objects count] > 0) {
requestedValue = [[objects objectAtIndex:0] valueForKey:@"maxSort"];
} else {
[[NSApplication sharedApplication] presentError:error];
}
[expressionDescription release];
[request release];
NSLog( @"Max Sort Order: %@", requestedValue );
return requestedValue;