Нечувствительный к регистру NSPredicate для строк от массива?

У меня есть ситуация, где я хочу выбрать объекты от своего базового хранилища данных ключом имени пользователя, но я хочу, чтобы сравнение было нечувствительно к регистру. Предикат, который я имею, является этим:

username IN $usernames

Я затем делаю подстановку переменных с массивом строк, которые являются именами пользователей, которые я хочу найти. Это работает, но чувствительно к регистру. Я хотел бы сделать что-то вроде этого, я думаю:

username IN[c] $usernames

К сожалению, это, кажется, не работает. Сравнение строк должно все еще происходить чувствительным к регистру способом. (Я не получаю ошибку об этом являющийся неподдерживаемым запросом.)

Существует ли другой способ записать этот предикат, таким образом, он прокладывает себе путь, мне нужно, или я просто пропускаю что-то очевидное здесь?

8
задан Sean 6 January 2010 в 22:58
поделиться

3 ответа

Модификатор регистра на операторе IN, по-видимому, игнорируется при выполнении фетча против хранилища SQLite. (Вы опустили тип магазина из своего вопроса.)

Я бы порекомендовал подать ошибку против документации, чтобы это ограничение/поведение могло быть задокументировано.

Я бы также порекомендовал написать запрос на функцию в репортере об ошибке, чтобы его можно было рассмотреть на предмет поддержки в будущем.

А пока вам придется вытащить запрос на получение данных из модели данных и построить его программно. Вы можете построить составной предикат ИЛИ предикат, в котором регистронезависимое равенство будет соответствовать каждому из ваших значений (и проверить, что оно удовлетворяет вашим требованиям к производительности)

Обратите внимание, что если вы поддерживаете цели ОС до 10.6, то регистронезависимый модификатор на == не поддерживается, и в этом случае потребуется еще одно альтернативное решение.

11
ответ дан 5 December 2019 в 14:03
поделиться

Вы можете попробовать что-нибудь вроде ЛЮБОГО $usernames LIKE[c] username. Я сделал нечто похожее, где вместо переменной подстановки у меня просто есть путь к ключу типа "persons.name", и этот предикат работает на меня. Не уверен, работает ли он по-другому с переменной там вместо пути к ключу, но стоит попробовать.

1
ответ дан 5 December 2019 в 14:03
поделиться

Вот еще один обходной путь, но требует смены MOM.

Сделать имя пользователя полнофункциональной сущностью. Создайте обратное отношение между именем пользователя и любой другой сущностью.

Теперь для запроса извлечения, установите сущность как "Username", затем запустите этот предикат (предполагая свойство "name" и свойство "parent"):

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

Это может быть чересчур, но позволит вам выполнять поиск по своему усмотрению.

1
ответ дан 5 December 2019 в 14:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: