获取核心数据对象属性最大值的简单可靠方法?
Posted
技术标签:
【中文标题】获取核心数据对象属性最大值的简单可靠方法?【英文标题】:An easy, reliable way to get max value of a core data object's attribute? 【发布时间】:2011-06-07 05:16:48 【问题描述】:是否有一种简单(或可靠)的方法可以找到核心数据属性的最大值? Apple 的example 只是不起作用(另外,对于这样一个简单的任务来说,它又长又复杂)。我为此花了将近一天的时间,但未能找到满意的答案。请帮忙!
我得到与这个问题相同的错误:-[NSCFNumber count]: unrecognized selector。和他一样,我一直没能找到解决问题的办法。
这位提问者认为他解决了同样的问题,但就像其他人评论的那样,这里的答案显然是错误的。
这个question 也遇到了完全相同的代码的问题,但至少提问者实际上没有遇到异常。看起来他无法让它正常工作,最终使用了不同的解决方案,但没有说什么。
一个人here 通过检索排序的结果并使用最高值解决了这个问题。不理想!但是,如果我不能很快找到解决方案,我认为我将不得不这样做,或者重组我的模型或业务规则,或者在我的模型中创建和维护一个 MaxValue 类来解决这个问题......
【问题讨论】:
【参考方案1】:我在核心数据编程指南的获取特定值下找到了这一点。它指的是最低限度,但它回答了你的问题。没有人们希望的那么容易,但也没有那么难。
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Event" inManagedObjectContext:context];
[request setEntity:entity];
// Specify that the request should return dictionaries.
[request setResultType:NSDictionaryResultType];
// Create an expression for the key path.
NSExpression *keyPathExpression = [NSExpression expressionForKeyPath:@"creationDate"];
// Create an expression to represent the minimum value at the key path 'creationDate'
NSExpression *minExpression = [NSExpression expressionForFunction:@"min:" 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:@"minDate"];
[expressionDescription setExpression:minExpression];
[expressionDescription setExpressionResultType:NSDateAttributeType];
// Set the request's properties to fetch just the property represented by the expressions.
[request setPropertiesToFetch:[NSArray arrayWithObject:expressionDescription]];
// Execute the fetch.
NSError *error = nil;
NSArray *objects = [managedObjectContext executeFetchRequest:request error:&error];
if (objects == nil)
// Handle the error
else
if ([objects count] > 0)
NSLog(@"Minimum date: %@", [[objects objectAtIndex:0] valueForKey:@"minDate"]);
[expressionDescription release];
[request release];
【讨论】:
谢谢,但这个例子给我在原始帖子中链接到的问题的人带来了问题。我也遇到了与那些人相同的问题,但无法找到帮助我解决问题的答案。无论如何,我完全同意“不像人们希望的那么容易”:恕我直言,这些方法的作者应该对他们在这种类型的框架中强加的冗长和违反直觉的程度感到尴尬。跨度> 我还没有机会尝试@grady 的答案,因为我在找到解决方法后继续前进(即使用从排序的降序获取请求返回的第一个对象)。解决方法显然不是最理想的(当我只想要一个对象时获取所有对象)所以我打算回去尝试@grady的答案。 这太棒了。我想知道使用这种方法是否有任何性能提升,而不是使用限制为 1 的 NSFetchRequest 和给定属性的排序描述符。【参考方案2】:有一个名为 TestEntity 的 NSManagedObject 子类,它有一个名为 tesetID 的双重属性。
-(double)getNextIndex
NSFetchRequest * request = [[NSFetchRequest alloc] init];
[request setEntity:[NSEntityDescription entityForName:@"TestEntity" inManagedObjectContext:self.managedObjectContext]];
NSError * err = nil;
NSArray * array = [self.managedObjectContext executeFetchRequest:request error:&err];
NSNumber * value = [array valueForKeyPath:@"@max.testID"];
return [value doubleValue]+1;
-(void)test
for (int i = 0; i<25 ; i++)
TestEntity * entity = [[TestEntity alloc] initWithEntity:[NSEntityDescription entityForName:@"TestEntity" inManagedObjectContext:self.managedObjectContext] insertIntoManagedObjectContext:self.managedObjectContext];
entity.testID = [NSNumber numberWithDouble:[self getNextIndex]];
NSLog(@"our testID is set as: %@",entity.testID);
【讨论】:
不,我的意思是,例如,最年长的员工的年龄是多少?或者我分配给学生的最大学生 ID 是什么?在 SQL 术语中,这将非常简单:select max(studentID) from student
您已经指出我在原始问题中所说的“解决方案”not 对我有用。然而,我又有了一次尝试。我设法避免[-NSCFNumber count]:unrecognized selector 但是 当我重复调用 max 时,将其递增并将其存储在一个新对象中,max 并不总是返回最新值。所以,例如使用 StudentID 创建 obj,获取最大 StudentID,使用 ++maxStudentID 创建新 obj。 10 次调用后,每 2 或 3 个对象具有相同的 StudentID!
迄今为止我发现的最可靠的解决方案是返回按降序排列的 StudentID 并取第一个
好的,我将用一些代码来解决这个问题。并发布答案。
好的,谢谢。我更新了我为避免该错误所做的工作(通过删除行 [request setResultType:NSDictionaryResultType];
here以上是关于获取核心数据对象属性最大值的简单可靠方法?的主要内容,如果未能解决你的问题,请参考以下文章