Cocoa – Case insensitive NSPredicate for strings from an array

cocoacore-datanspredicate

I have a situation where I want to fetch objects from my core data store by the username key, but I want the comparison to be case-insensitive. The predicate I have is this:

username IN $usernames

I then do a variable substitution with an array of strings that are the usernames I want to find. It works but is case-sensitive. I'd like to do something like this, I think:

username IN[c] $usernames

Unfortunately that doesn't appear to work. The string comparison must still be happening in a case-sensitive way. (I don't get an error about it being an unsupported query.)

Is there a different way to write this predicate so it works the way I need or am I just missing something obvious here?

Best Answer

The case modifier on the IN operator is apparently ignored when executing a fetch against the SQLite store. (You omitted the store type from your question.)

I'd recommend filing a bug against the documentation so that this limitation/behavior can be documented.

I'd also recommend filing a feature request in the bug reporter so that this can be considered for future support.

In the meantime, you'll have to pull your fetch request out of the data model and build it up programatically. You can build a compound predicate OR predicate that does a case insensitive equality match for each of your values (and test that it meets your performance needs.)

Note that if you are supporting OS targets prior to 10.6 the case modifier on == is not supported, in which case yet another alternate solution will be required.

Related Topic