我在网上搜索这个问题的答案,但不幸的是,我认为我在核心数据过程中不够流利,无法真正包含正确的关键字组合。
我有两个实体......Users
并且Bookmarks
具有一对多的关系。
Users
: string:firstName
, string:lastname
,string:iconImage
与Bookmarks
- 逆关系
Bookmarks
: string:title
, string:url
, string:content
, image:Binary Data
,order:Integer32
与Users
- 逆关系
我的目标是查询特定用户的书签并找到 key: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];
有没有人有什么建议?我知道我可以为用户返回所有书签并编写代码来找到我的价值,但我想以最有效的方式来做。
感谢您的任何帮助。