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】:

根据CKQuerydocs:

对于包含字符串值的字段,可以匹配开头 使用 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

使用 NSPredicate 和数组进行 cloudKit 搜索

Cloudkit 的 NSPredicate 匹配字符串

CloudKit,NSPredicate 在私有容器中返回计数或确定是不是存在任何记录?