CloudKit NSPredicate 不区分大小写
Posted
技术标签:
【中文标题】CloudKit NSPredicate 不区分大小写【英文标题】:CloudKit NSPredicate case insensitive 【发布时间】:2015-10-13 15:34:03 【问题描述】:我有一个云工具包查询,它使用下面的 NSPredicate 来搜索名称以用户在 UITextField
中输入的值开头的记录。我想让搜索不区分大小写,因此如果用户搜索“apple”,它将显示“Apple”和“apple”的结果。
我怎样才能做到这一点?我还尝试将查询更改为CONTAINS
而不是BEGINSWITH
,但应用程序没有返回任何结果,因为它正在寻找数组中的值。是否可以查看字符串是否包含文本字段字符串?
谢谢
var p = NSPredicate(format: "name BEGINSWITH %@", titleLabel.text!)
【问题讨论】:
BEGINSWITH[c]
? “默认情况下,字符串比较区分大小写和变音符号。您可以使用方括号内的键字符 c 和 d 修改运算符,以分别指定不区分大小写和变音符号,例如 firstName BEGINSWITH[cd] $FIRST_NAME。”来自developer.apple.com/library/watchos/documentation/Cocoa/…(字符串比较部分)
我应该把$FIRST_NAME
放在哪里titleLabel.text!
?
"name BEGINSWITH[c] %@"
是你应该做的。
当我添加它在NSPredicate
添加到CKQuery
的行上崩溃。这是行:let q = CKQuery(recordType: "Content", predicate: p)
我认为您不能使用 CloudKit 谓词进行不区分大小写的搜索。 CloudKit 谓词仅使用 NSPredicate 可能的一个子集。您可以使用一种解决方法,在其中创建一个名为 nameSearch 的新字段并以小写形式复制那里的数据。然后您可以在该字段中进行小写搜索。
【参考方案1】:
根据CKQuery
docs:
对于包含字符串值的字段,可以匹配开头 使用 BEGINSWITH 运算符的字符串的一部分,如 清单 4. 您不能使用其他字符串比较运算符,例如 包含或结束。使用此运算符时,该字段必须包含 一个字符串值,并且必须以您指定的字符串开头。 匹配 区分大小写。 在示例中,谓词匹配记录 其 favoriteColors 字段包含字符串 red、reddish 或 red 绿色胶带。
【讨论】:
BEGINSWITH 区分大小写是正确的。但是,您可以使用 NSPredicate(format: "self contains %@", NSString(string: name)) 对 self 进行查询,那么它不区分大小写。确保将其标记为在仪表板中进行查询等。以上是关于CloudKit NSPredicate 不区分大小写的主要内容,如果未能解决你的问题,请参考以下文章
NSPredicate 和 BEGINSWITH with CloudKit:字段值类型不匹配
使用 NSPredicate 查询 CloudKit 以获取空白(或 null 或其他)的日期
将 NSPredicate/NSCompoundPredicate 与 Where 子句或可选返回一起使用,CloudKit