NSPredicate是否可以使用不区分大小写的搜索与核心数据进行比较?(Swift 4)

NSPredicate是否可以使用不区分大小写的搜索与核心数据进行比较?(Swift 4),swift,core-data,nspredicate,Swift,Core Data,Nspredicate,在我的例子中,核心数据中有一个对象,其id字段是字符串。该字段由不同平台上的多个客户端填充,应该是GUID/UUID。理想情况下,这些都应该是大写的,但不是所有的客户机实现都这样做,并且存储它们的代码没有考虑到这一点。现在让我们忽略明显的架构错误。我需要的是一种不区分大小写的搜索方法。因为我现在只需从存储器中获取所有数据,然后使用Swift数组过滤函数对它们进行过滤。这是可行的,但效率不高,当数据集变大时,需要大量的RAM。我试着使用一个谓词,比如 fetchRequest.predicate=

在我的例子中,核心数据中有一个对象,其id字段是字符串。该字段由不同平台上的多个客户端填充,应该是GUID/UUID。理想情况下,这些都应该是大写的,但不是所有的客户机实现都这样做,并且存储它们的代码没有考虑到这一点。现在让我们忽略明显的架构错误。我需要的是一种不区分大小写的搜索方法。因为我现在只需从存储器中获取所有数据,然后使用Swift数组过滤函数对它们进行过滤。这是可行的,但效率不高,当数据集变大时,需要大量的RAM。我试着使用一个谓词,比如

fetchRequest.predicate=NSPredicate(格式:“someId IN[cd]@”,ids)


其中,ids是一个字符串数组。这不管用。可以用带块的谓词来解决吗?还有其他解决方案吗?

谢谢Martin R的评论,它让我找到了适合我的解决方案。我最终得到了这个解决方案。这并不是我想要的,但是知道ids数组很少有超过10个条目,它现在就可以了,因为它至少解决了内存问题。希望Swift和核心数据将在未来提供更好的解决方案

var predicates = [NSPredicate]()

for id in idList
{
     predicates.append(NSPredicate(format: "temporaryId LIKE[c] %@", id))
}

fetchRequest.predicate = NSCompoundPredicate(orPredicateWithSubpredicates: predicates)

感谢Martin R的评论,它引导我找到了适合我的解决方案。我最终得到了这个解决方案。这并不是我想要的,但是知道ids数组很少有超过10个条目,它现在就可以了,因为它至少解决了内存问题。希望Swift和核心数据将在未来提供更好的解决方案

var predicates = [NSPredicate]()

for id in idList
{
     predicates.append(NSPredicate(format: "temporaryId LIKE[c] %@", id))
}

fetchRequest.predicate = NSCompoundPredicate(orPredicateWithSubpredicates: predicates)

恐怕您在这里运气不好,比较(可能重复?),基于块的谓词不能用于核心数据获取请求正如您所说,规范化数据库中的数据将是正确的解决方案。恐怕您在这里运气不好,比较(可能重复?)和基于块的谓词不能用于核心数据获取请求正如您所说,规范化数据库中的数据将是正确的解决方案。使用字符串插值来构建谓词容易出错,而且很危险。如果
id
恰好包含一个特殊字符(例如引号),则可能会崩溃。最好看看NSCompoundPredicate,动态构建“或谓词”。我已经按照您的建议更改了我的解决方案。看起来很好用。感谢您的时间,如果您看到我需要更改的其他内容,我将非常感谢您的进一步帮助:)使用字符串插值构建谓词容易出错,而且很危险。如果
id
恰好包含一个特殊字符(例如引号),则可能会崩溃。最好看看NSCompoundPredicate,动态构建“或谓词”。我已经按照您的建议更改了我的解决方案。看起来很好用。感谢您抽出时间,如果您看到我需要更改的其他内容,我将非常感谢您的进一步帮助:)