2016-04-15 3 views
0

Мне нужно вытащить запись из облачного текста, соответствующего строке.Соответствующая строка NSPredicate для Cloudkit

У меня есть тип записи пользователя с полем электронной почты. У меня есть несколько записей с тем же адресом электронной почты, но я не могу получить предикат, чтобы получить записи.

Я пробовал все эти:

let predicate = NSPredicate(format: "email = '[email protected]'") 
NSPredicate(format: "email == %@", argumentArray: [email]) 
NSPredicate(format: "email IN %@", [email]) 
NSPredicate(format: "email contains %@", email) 
NSPredicate(format: "email = %@", email) 
NSPredicate(format: "email == %@", email) 

Мой запрос определяет тип записи:

let query = CKQuery(recordType: "User", predicate: NSPredicate(format: "email == %@", email)) 

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

Что мне не хватает?

Edit ..

let query = CKQuery(recordType: "User", predicate: NSPredicate(format: "email BEGINSWITH %@", email)) 

ли работа и возвращает запись, но я хочу точное совпадение!

+0

ли 'LIKE' вместо' '== работы? – HAS

ответ

1

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

let word1 = "Mac" 

let predicate = NSPredicate(format: "Title CONTAINS %@", word1) 

Это работало, но только тогда, когда «word1» было одно слово без пробелов и «Title» был «Список строк» ​​в облаке.

Разъяснения, что я встречал во всех моих исследованиях:

Вы должны использовать термин «я», когда вы создаете предикат и то, что делает он ищет все поля, которые являются для поиска строки , Вот информация, которую я получил от Apple's Website.

Предикаты поддерживает следующие переменные строки подстановки:

Используйте% @ для объектов значений, таких как строки, числа и даты.

Используйте поле% K для названия поля. Эта переменная замещения указывает, что заменяемая строка должна использоваться для поиска имени поля.

За одним исключением оператор CONTAINS может использоваться только для проверки принадлежности к списку. Исключение составляет то, когда вы используете его для выполнения полнотекстовых поисков в сочетании с собственным ключом. Путь к самому ключу приводит к тому, что сервер просматривает поля поиска, доступные для поиска, для указанной строки токена. Например, предикатная строка @ "self contains 'blue'" ищет слово «синий» во всех полях, помеченных для включения в полнотекстовые поиски. Вы не можете использовать собственный ключ для поиска в полях, тип которых не является строкой.

Что я в итоге делаю, что должен быть лучшим способом, мое свойство «Название» по-прежнему является «Строковым списком» в облаке, и в моем коде я сделал массив всех слов в мой поискTerm и с каждым словом в searchTerm я сделал отдельный NSPredicate, и я использовал их как часть NSCompoundPredicate. Затем я добавил NSCompoundPredicate к моей подписке, и это сработало.Вот мой пример:

var searchCriteria: [NSPredicate] = [] 

for word in searchTerm { 
    let predicate = NSPredicate(format: "self CONTAINS %@", word) 
    searchCriteria.append(predicate) 
} 

let p2 = NSPredicate(format: "Price > %d", minPrice) 

let p3 = NSPredicate(format: "Price < %d", maxPrice) 

let p4 = NSPredicate(format: "Category == %d", category) 

searchCriteria.append(p2) 
searchCriteria.append(p3) 
searchCriteria.append(p4) 

let compoundPredicate = NSCompoundPredicate(andPredicateWithSubpredicates: searchCriteria) 

Надеюсь, это поможет. Должен быть лучший способ сделать это, и если кто-нибудь знает, сообщите мне, потому что я понимаю, что нет много хороших объяснений, как делать вещи с CloudKit.

+0

Смешно, что вы прокомментировали, потому что яблоко ответило на мой радар, сказав, что проблема исправлена ​​... Но я не смог ее протестировать, так как я не кодирую свои электронные письма и не имел проблемы с тех пор. – JDM

+0

Это интересно. Хорошо, если вы закончите тестирование, и это сработает для вас, пожалуйста, дайте мне знать, как вы это сделали. – avanalfen

1

У меня была такая же проблема и я смог ее решить, добавив индекс Queryable в поле пользователя в моем случае. Обратите внимание: после добавления индекса мне нужно было снова записать данные в CloudKit для выполнения запроса.

Код для создания предиката:

let user = "test-user" 
let userPredicate = NSPredicate(format: "user == %@", user) 
Смежные вопросы