从核心数据关系中获取最大值

时间:2013-01-06 14:32:47

标签: ios core-data nsfetchrequest

我在网上搜索这个问题的答案,但不幸的是我认为我在核心数据程序方面不够流畅,无法真正包含正确的关键词组合。

我有两个实体...... UsersBookmarks具有一对多的关系。

Usersstring:firstNamestring:lastnamestring:iconImageBookmarks的关系 - 逆

Bookmarksstring:titlestring:urlstring:contentimage:Binary Dataorder:Integer32Users的关系 - 逆

我的目标是查询特定用户的书签并查找密钥的最高编号:order,这样当我添加新书签时,它将大于最大值。我已经看过Apple的例子,它有效并且有意义,但我还需要更多。该示例返回该实体中所有记录的最大值。

-(NSNumber*) getNextBookmarksOrderForUser:(NSManagedObjectID*)userID
{
    NSNumber *highOrder;
    Users *user =[self getUserByID:userID];

    if (user)
    {
        NSExpression *keyPathExpression     = [NSExpression expressionForKeyPath:@"order"];
        NSExpression *highestOrderingNumber = [NSExpression expressionForFunction:@"max:" arguments:[NSArray arrayWithObject:keyPathExpression]];
        NSExpressionDescription *expressionDescription = [[NSExpressionDescription alloc]init];
        [expressionDescription setName:@"maxOrdering"];
        [expressionDescription setExpression:highestOrderingNumber];
        [expressionDescription setExpressionResultType:NSDecimalAttributeType];

        NSEntityDescription *entity = [NSEntityDescription entityForName:@"Bookmarks" inManagedObjectContext:[_dataContext managedObjectContext]];


        NSFetchRequest *request = [[NSFetchRequest alloc]init];        
        [request setEntity:entity];
        [request setPropertiesToFetch:[NSArray arrayWithObject:expressionDescription]];
        [request setResultType:NSDictionaryResultType];


        NSError *error = nil;
        NSArray *objects = [[_dataContext managedObjectContext] executeFetchRequest:request error:&error];

        if(objects == nil) {
            // Handle the error
        }
        else {
                if ([objects count] > 0) {

                highOrder = [NSNumber numberWithInt:[[[objects objectAtIndex:0] valueForKey:@"maxOrdering"]intValue]];

            NSLog(@"Highest ordering number: %@", highOrder);               
            }   
        }        

        return highOrder;
    }

    return nil;
}

因此,如果我有两个用户,一个有10个书签,另一个有25个,上面的代码将始终返回25.我尝试添加一个谓词:

NSPredicate *byUser = [NSPredicate predicateWithFormat:@"self == %@", user];
[request setPredicate:byUser];

有没有人有任何建议?我知道我可以为用户返回所有书签并编写代码以找到我的价值,但我想以最有效的方式来做。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

从我的评论中

我认为您应该使用这样的谓词[NSPredicate predicateWithFormat:@"users == %@", user];因为您要查询Bookmarks