On Feb 10, 2011, at 07:19, WT wrote:

> The test project's core data model has a single entity, "CountryCD", with the 
> attributes "name", "index", "selected" (representing a boolean), and a 
> transformable attribute "indexOrName" which returns the entity's index if 
> it's selected or its name if it's deselected.
> 
> - (id) indexOrName;
> {
>    if ([self.selected isEqualToNumber: [NSNumber numberWithBool: YES]])
>    {
>        return self.index;
>    }
>    else
>    {
>        return self.name;
>    }
> }
> 
> The fetched results controller is defined as usual but contains two sort 
> descriptors:
> 
> NSSortDescriptor* sortBySelected = [[NSSortDescriptor alloc]
>    initWithKey: @"selected" ascending: NO];
> 
> NSSortDescriptor* sortByIndexOrName = [[NSSortDescriptor alloc]
>    initWithKey: @"indexOrName" ascending: YES];
> 
> the idea being that entities get sorted first by their "selected" status and 
> then by their "indexOrName" attribute. Since that attribute returns the 
> entity's "index" or its "name", depending on the entity's "selected" status, 
> the fetched results controller *should* sort the entities as desired.

What you've shown above, assuming it's actual code from your managed object 
subclass, is not a transformable attribute but a derived attribute -- one that 
depends for its value solely on the values of other properties, and doesn't 
make use of any backing storage of its own. A transformable attribute is one 
whose backing storage representation is a different class from its in memory 
representation, with the translation between the two forms handled 
automatically by a value transformer.

Perhaps you're assuming that Core Data will internally call the above getter to 
figure out what to put into the store. It doesn't work that way. Most likely 
your store contains nil values for the "indexOrName" attribute. (I'm assuming 
your Core Data model actually has an "indexOrName" attribute. If not, it still 
won't work, but for a different reason.)

The thing you're sorting is a fetched results controller. Presumably that sorts 
itself based on the fetched attribute values (all nil for "indexOrName" in this 
case), which means that all objects have the same value for the attribute, so 
the result of sorting is essentially random, as you've seen.

You either need to get the actual values of "indexOrName" into the store, or 
you need to do your own sorting after the objects have been fetched.


_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

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 arch...@mail-archive.com

Reply via email to