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?
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.
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.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With