У меня есть ситуация, где я хочу выбрать объекты от своего базового хранилища данных ключом имени пользователя, но я хочу, чтобы сравнение было нечувствительно к регистру. Предикат, который я имею, является этим:
username IN $usernames
Я затем делаю подстановку переменных с массивом строк, которые являются именами пользователей, которые я хочу найти. Это работает, но чувствительно к регистру. Я хотел бы сделать что-то вроде этого, я думаю:
username IN[c] $usernames
К сожалению, это, кажется, не работает. Сравнение строк должно все еще происходить чувствительным к регистру способом. (Я не получаю ошибку об этом являющийся неподдерживаемым запросом.)
Существует ли другой способ записать этот предикат, таким образом, он прокладывает себе путь, мне нужно, или я просто пропускаю что-то очевидное здесь?
Модификатор регистра на операторе IN, по-видимому, игнорируется при выполнении фетча против хранилища SQLite. (Вы опустили тип магазина из своего вопроса.)
Я бы порекомендовал подать ошибку против документации, чтобы это ограничение/поведение могло быть задокументировано.
Я бы также порекомендовал написать запрос на функцию в репортере об ошибке, чтобы его можно было рассмотреть на предмет поддержки в будущем.
А пока вам придется вытащить запрос на получение данных из модели данных и построить его программно. Вы можете построить составной предикат ИЛИ предикат, в котором регистронезависимое равенство будет соответствовать каждому из ваших значений (и проверить, что оно удовлетворяет вашим требованиям к производительности)
Обратите внимание, что если вы поддерживаете цели ОС до 10.6, то регистронезависимый модификатор на == не поддерживается, и в этом случае потребуется еще одно альтернативное решение.
Вы можете попробовать что-нибудь вроде ЛЮБОГО $usernames LIKE[c] username
. Я сделал нечто похожее, где вместо переменной подстановки у меня просто есть путь к ключу типа "persons.name", и этот предикат работает на меня. Не уверен, работает ли он по-другому с переменной там вместо пути к ключу, но стоит попробовать.
Вот еще один обходной путь, но требует смены MOM.
Сделать имя пользователя полнофункциональной сущностью. Создайте обратное отношение между именем пользователя и любой другой сущностью.
Теперь для запроса извлечения, установите сущность как "Username", затем запустите этот предикат (предполагая свойство "name" и свойство "parent"):
[NSPredicate predicateWithFormat:"(name like[c] %@) && (parent == %@)", theUserName, theParentObject]
Это может быть чересчур, но позволит вам выполнять поиск по своему усмотрению.