Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Case insensitive NSPredicate for strings from an array?

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?

like image 405
Sean Avatar asked Jan 06 '10 22:01

Sean


3 Answers

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.

like image 163
Jim Correia Avatar answered Nov 08 '22 15:11

Jim Correia


You might try something like ANY $usernames LIKE[c] username. I've done something similar, where instead of the variable substution, I just have a key path like "persons.name", and that predicate works for me. Not sure if it works any differently with a variable there instead of a key path, but it's worth a shot.

like image 31
Brian Webster Avatar answered Nov 08 '22 14:11

Brian Webster


Here is another workaround, but requires you to change the MOM.

Make username a full blown entity. Create the inverse relationship between username and whatever your other entity is.

Now for the fetch request, set the entity as "Username" then run this predicate (assuming a "name" property and "parent" property):

   [NSPredicate predicateWithFormat:"(name like[c] %@) && (parent == %@)", theUserName, theParentObject]

This may be overkill, but will allow you to run your search as desired.

like image 27
Corey Floyd Avatar answered Nov 08 '22 13:11

Corey Floyd