0

我有一个类Download作为CKQueryOperation. 其中一个 inits 允许我使用一组值构建我的谓词:

init(type: String, queryField: String, queryValues: [CKRecordValue], to rec: RecievesRecordable, from database: CKDatabase? = nil) {
    let predicate = NSPredicate(format: "\(queryField) = %@", argumentArray: queryValues)
    query = CKQuery(recordType: type, predicate: predicate)

    reciever = rec
    db = database

    super.init()
}

当我测试它时,query只匹配数组中的第一个值。因此,如果queryValues = [testValue0, testValue1]我有一个字段匹配的记录,testValue0并且我有第二个匹配的记录testValue1,则只会发现第一条记录。如果我切换订单,则另一条记录会被识别。

我可以使用数组创建谓词但只有第一个值匹配,这似乎很奇怪。文档说值是按照它们出现的顺序替换的,但它不应该继续移动到第二个值吗?

对于更多上下文,每条记录都存储在一个单独的数据库中(私有与公共),如果param 为 nil ,我的Download班级会启动两个独立CKQueryOperations的两个都依赖的数据库。无论哪个操作失败,最终都找不到与第一个值匹配的结果,然后在检查第二个值之前放弃。querydatabase

如果需要,我可以包含“下载”的完整代码和失败的单元测试。

4

2 回答 2

3

您使用了错误的谓词。您想使用该IN操作。并且不要使用字符串替换字段名称,而是使用%K格式说明符:

let predicate = NSPredicate(format: "%K IN %@", arguments: queryField, queryValues)

请注意,NSPredicate(format:argumentArray:)期望参数数组中的每个值的格式字符串中都有一个格式说明符。由于您的格式只有一个格式说明符,因此只有第一个值是从数组中获取的。并且由于您使用=了 ,因此该字段仅与该值进行了比较。

于 2017-06-02T03:36:34.137 回答
1

基本比较 =, == 左边的表达式等于右边的表达式。

=, => 左边的表达式大于或等于右边的表达式。<=, =< 左边的表达式小于或等于右边的表达式。左边的表达式大于右边的表达式。< 左边的表达式小于右边的表达式。!=, <> 左边的表达式不等于右边的表达式。

字符串比较

BEGINSWITH 左边的表达式以右边的表达式开始。

CONTAINS 左边的表达式包含右边的表达式。

ENDSWITH 左边的表达式以右边的表达式结束。

LIKE 左边的表达式等于右边的表达式: ? 和

  • 允许作为通配符,在哪里?匹配 1 个字符, * 匹配 0 个或更多字符。

匹配 根据 ICU v3,左侧表达式使用正则表达式样式比较等于右侧表达式(有关更多详细信息,请参阅 ICU 正则表达式用户指南)。

我使用了基本比较

let resultPredicate = NSPredicate(format: "%K = %@", "key", "value")
let result_filtered = MYARRAY.filtered(using: resultPredicate) as NSArray

更多信息:谓词编程指南

于 2021-03-08T15:20:52.197 回答