1

私はこの問題の答えをネットで検索しますが、残念ながら、実際にキーワードの適切な組み合わせを含めるのに十分なコアデータ手順に精通しているとは思いません。

私には2つのエンティティがあります...UsersそしてBookmarks1対多の関係にあります。

Usersstring:firstName、、-逆 との関係をstring:lastname持つstring:iconImageBookmarks

Bookmarksstring:title、、、、string:urlstring:contentの 関係でimage:Binary Data-逆order:Integer32Users

ここでの私の目標は、特定のユーザーのブックマークを照会し、key:orderの最大数を見つけることです。これにより、新しいブックマークを追加したときに、最大数より1つ大きくなります。私は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;
}

したがって、2人のユーザーがいる場合(1つは10ブックマーク、もう1つは25)、上記のコードは常に25を返します。述語を追加してみました。

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

誰か提案はありますか?ユーザーのすべてのブックマークを返し、自分の値を見つけるためのコードを書くことができることは知っていますが、それを最も効率的な方法で行いたいと思います。

助けてくれてありがとう。

4

1 に答える 1

0

私のコメントより

[NSPredicate predicateWithFormat:@"users == %@", user];に対してクエリを実行しているため、このような述語を使用する必要があると思いますBookmarks

于 2013-01-06T15:55:03.647 に答える