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

Posted

技术标签:

【中文标题】从核心数据关系中获得最大价值【英文标题】:Getting a maximum value from a core data relationship 【发布时间】:2013-01-06 14:32:47 【问题描述】:

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

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

Users : string:firstName, string:lastname, string:iconImageBookmarks 有关系 - 反向

Bookmarks : string:title, string:url, string:content, image:Binary Data, order:Integer32Users 有关系 - 反向

我的目标是查询特定用户的书签并找到 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];

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

感谢您的帮助。

【问题讨论】:

我认为你应该使用像[NSPredicate predicateWithFormat:@"users == %@", user]; 这样的谓词,因为你反对Bookmarks。我想一个用户可以有一个或多个书签,而一个书签与单个用户相关联。 勘误表:由于您查询... 天哪,我现在感觉自己像个白痴。谢谢,这正是我需要的。不幸的是,核心数据有时有点混乱。这个方法只是一个标准的 SQL 查询,我在 Core Data 对象中思考。再次感谢您。 不客气。我添加了我的评论作为回复。如果需要,请将其标记为已回答。 【参考方案1】:

来自我的评论

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

【讨论】:

以上是关于从核心数据关系中获得最大价值的主要内容,如果未能解决你的问题,请参考以下文章

leetcodeF47 礼物的最大价值

Pandas groupby 类别,评级,从每个类别中获得最高价值?

如何定义客户价值?聚类算法告诉你!

crm软件如何把客户价值最大化?

发现难以获得最大价值

Swift 3 - 从核心数据中获取价值