使用NSPredicate获取ID的最大计数

时间:2014-07-12 09:14:08

标签: ios core-data ios7 nspredicate

我在核心数据中有一个实体,如下所示:

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,以便我可以插入下一条记录。

有更好的方法吗?

2 个答案:

答案 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