我在核心数据中有一个实体,如下所示:
PHOTOS
userId (pk)
photoId (pk)
photoData
// The predicate request
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Photos"];
request.predicate = [NSPredicate predicateWithFormat:@"userId = %@", userId];
NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"photoId" ascending:NO];
request.sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
我实际上想获得userId的最大photoId,以便我可以插入下一条记录。
有更好的方法吗?
答案 0 :(得分:2)
将fetchLimit
设置为1进行排序的代码要少得多,并且在大多数用例中效率都很高。所以你的解决方案更可取。
或者,对于更少的代码,您可以省略排序描述符和获取限制,只在内存中过滤(Apple也建议这样做):
NSNumber *max = [results valueForKeyPath:@"@max.photoId"];
答案 1 :(得分:0)
我建议结合你的fetchrequest使用NSExpression。下面的代码将获取最大的标识符,但是如果你添加一个谓词,它应该按照你要查找的内容进行操作,并且SQL查询会稍微快一点......
+ (NSArray*)fetchMostRecentIdentifierFromContext:(NSManagedObjectContext*)moc_ error:(NSError**)error_ {
NSParameterAssert(moc_);
NSError *error = nil;
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Photos" inManagedObjectContext:moc_];
[request setEntity:entity];
[request setResultType:NSDictionaryResultType];
// Create an expression for the key path.
NSExpression *maxExpression = [NSExpression expressionForFunction:@"max:" arguments:@[[NSExpression expressionForKeyPath:@"identifier"]]];
NSExpressionDescription *expressionDescription = [[NSExpressionDescription alloc] init];
[expressionDescription setName:@"photoId"];
[expressionDescription setExpression:maxExpression];
[expressionDescription setExpressionResultType:NSInteger16AttributeType];
[request setPropertiesToFetch:[NSArray arrayWithObject:expressionDescription]];
NSArray *result = [moc_ executeFetchRequest:request error:&error];
if (error_) *error_ = error;
return result;
}
更多信息: http://useyourloaf.com/blog/2012/01/19/core-data-queries-using-expressions.html