NSP предикат для поиска строки с двойными кавычками - PullRequest
0 голосов
/ 08 октября 2019

Элементом атрибута в модели coredata является строка (формат строки json), представляющая собой массив словарей, как показано ниже:

один элемент имеет

"[{"tagName":"sad","count":2},{“tagName":"happy","count":1}]"

, а другой -

"[{"tagName":"sad1","count":2},{“tagName":"happy1","count":1},{“tagName":"nothappy","count":1}]"

Нужен поиск по списку со ссылкой на тэг.

Если я использую предикат ниже,

tagName = "sad"
tagNameFilter += String(format: "vrTags CONTAINS[cd] \"%@\"", tagName)

возвращает оба элемента. Он должен возвращать только первый элемент

Если я использую без двойных кавычек

tagName = "sad"
tagNameFilter += String(format: "vrTags CONTAINS[cd] %@", tagName)

, он вылетает по причине:

unimplemented SQL generation for predicate : (vrTags CONTAINS[cd] sad) (LHS and RHS both keypaths) with userInfo of (null)

Если я использую

tagName = "sad"
tagNameFilter += String(format: "vrTags CONTAINS[cd] \"\"%@\"\"", tagName)

сбой по причине: Unable to parse the format string

Как решить эту проблему с фильтром? Любые предложения будут оценены.

1 Ответ

1 голос
/ 08 октября 2019

Чтобы найти строку "sad", включая кавычки, необходимо передать эту строку с кавычками в качестве аргумента NSPredicate(format:). Это можно сделать с помощью строковой интерполяции:

let tagName = "sad"
let predicate = NSPredicate(format: "vrTags CONTAINS[cd] %@", "\"\(tagName)\"")
print(predicate) // vrTags CONTAINS[cd] "\"sad\""

И , никогда , используйте String(format:) и конкатенацию строк для построения сложных предикатов. Это очень подвержено ошибкам, потому что правила цитирования и экранирования для строк предикатов отличаются от правил для форматирования строк.

Если вам нужно объединить несколько условий с «И», сделайте это как

let p1 = NSPredicate(...)
let p2 = NSPredicate(...)
// ...
let predicate = NSCompoundPredicate(andPredicateWithSubpredicates: [p1, p2, ...])
...