Andreas

First off, thank you for taking the time to read my essay.

I did not know the setReturnDistinctResults: was dependant on 
setPropertiesToFetch:
your explanation is outstanding.

That did the trick, and I thank you very much.

Sandro.

On 2011-03-17, at 6:49 PM, Andreas Grosam wrote:

> 
> On Mar 17, 2011, at 8:15 PM, Sandro Noël wrote:
> 
>> Greetings!
>> 
>> I am facing a problem with a complicated predicate I'm building.
>> 
> ...
> 
>> then this predicate is fed to a fetch Request which in turn is fed to a 
>> fetched Result Controller.
>> the fetch is configured to   [fetchRequest setReturnsDistinctResults:YES];
>> 
>> The problem as stated in the introduction this complete predicate returns 
>> multiple instances of the same record and it should not.
> 
> About setReturnsDistinctResults:
> "If YES, the request returns only distinct values for the *fields specified 
> by propertiesToFetch*."
> 
> That is, setReturnDistinctResults: makes only sense IFF you also specified 
> the set of properties you want to fetch (via -setPropertiesToFetch). And this 
> requires that you specify NSDictionaryResultType for the resultType property 
> of the fetch request. As a result, with setReturnDistinctResults:YES you get 
> a set of dictionaries whose values are distinct.
> 
> In other words, you cannot use -setReturnsDistinctResults:YES to make your 
> result set distinct if this array contains *managed objects*.
> 
> 
> You might use a NSSet which you initialize from your original array of 
> managed objects in order to get a unique set.
> 
> Alternatively, you might fetch just objectID properties using a 
> NSDictionaryResultType. This, however, is a bit elaborated:
> 
> When you return (unique) dictionaries as objects in your result array, and if 
> you want these dictionaries having a key "objectID" which value corresponds 
> the actual managed object of this dictionary instance, you need to create an 
> appropriate NSExpressionDescription: and include this property description in 
> the array which you pass to -setPropertiesToFetch:
> 
> NSExpressionDescription* objectIdDescription = [[NSExpressionDescription 
> alloc] init];
> [objectIdDescription setExpression:[NSExpression 
> expressionForEvaluatedObject]];
> [objectIdDescription setExpressionResultType:NSObjectIDAttributeType];
> 
> Note: NSExpressionDescription is subclassed from NSPropertyDescription.
> 
> Then you use objectIdDescription as one of the properties 
> (NSPropertyDescription) you want to fetch:
> [myFetchRequest setPropertiesToFetch:[NSArray arrayWithObject: 
> objectIdDescription]];
> 
> Don't forget to set the result type (after you set the entity):
> [myFetchRequest setResultType: NSDictionaryResultType];
> [myFetchRequest setReturnsDistinctResults:YES];
> ...
> 
> 
> The next step would be to extract the objectIDs from the array of 
> dictionaries and store them in an array for convenience.
> 
> 
> Regards
> Andreas
> 
> 
>> if any of you see a flaw in the logic or anything, please comment, I'm 
>> currently so deep into it, I cant see it anymore. :)
>> 
>> I hope I have not missed nay details.
>> Thank you!!!
>> Sandro.
> _______________________________________________
> 
> Cocoa-dev mailing list ([email protected])
> 
> Please do not post admin requests or moderator comments to the list.
> Contact the moderators at cocoa-dev-admins(at)lists.apple.com
> 
> Help/Unsubscribe/Update your Subscription:
> http://lists.apple.com/mailman/options/cocoa-dev/apple.lists%40gestosoft.com
> 
> This email sent to [email protected]

_______________________________________________

Cocoa-dev mailing list ([email protected])

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to [email protected]

Reply via email to