У меня есть некоторый код Core Data, который точно соответствует образцу Apple (значения атрибутов Fetching, которые удовлетворяют данной функции пример).Я использую его, чтобы получить максимальное значение поля, поэтому я могу увеличивать его, когда вставляю следующий объект этого типа сущности.
Я не мог заставить код работать вообще, покаЯ переключил тип магазина со NSXMLStoreType
на NSSQLiteStoreType
, и вдруг все, казалось, работало.Однако это не так.Я заметил, что он всегда будет возвращать одно и то же значение, даже когда я вставляю объекты с более высоким значением.Но после того, как я вышел и снова открыл (и таким образом данные были сохранены и прочитаны обратно), он обновится с новыми вставками.
Итак, я начал фиксировать и сохранять после каждой вставки.После первого «автосохранения» я получаю сообщение об ошибке ниже (дважды подряд):
- [NSCFNumber count]: нераспознанный селектор, отправленный экземпляру 0x100506a20
Это происходит (два раза подряд), когда я выполняю запрос на выборку один раз:
NSArray *objects = [context executeFetchRequest:request error:&error];
Обновление
Я пропустил свой код через инструмент Zombies и былвозможность взглянуть на объект, который получает ошибку.Вызов, который запускает malloc
для его выделения: -[NSUserDefaults(NSUserDefaults) initWithUser:]
.Поскольку у меня не установлены собственные значения по умолчанию, я не знаю, какой это может быть объект.
Обновление 2
Я просмотрел все своикод для «выпуска» и закомментированные каждые release
или autorelease
, на которые статический анализатор не жаловался.Я все еще получил ошибки.Я даже зашел так далеко, что закомментировал каждый последний release
/ autorelease
в своем коде, и все еще получил его.Теперь я почти уверен, что мой собственный код не переиздан.
Обновление 3
Этот пост , кажется, имеет то же самоепроблема, но его решение не имеет смысла.Он изменил тип результата с NSDictionaryResultType
на NSManagedObjectResultType
, что дает неверный результат.Вместо того, чтобы возвращать единственное значение (max
, которое я ищу, которое возвращает каждый объект моего класса сущности в контексте управляемого объекта.
Вот самые верхние уровни стекаtrace (когда у меня это происходит в случае исключения, в первый раз):
#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;