在我的应用程序中,我使用核心数据作为离线持久性数据库。 一切都按预期工作,直到我的客户希望对搜索记录进行一些修改。
我要做的是,如果有人尝试使用 e 进行搜索,我的查询应该得到所有具有 é è ê ë 字符的记录......或其他任何字符非英语语言中“e”的形式。
这可以在 SQL 查询中通过对列名进行 COLLATE 来实现。但无法使用 COLLATE 创建 NSPredicate,有人可以帮我解决这个问题吗?
我的代码是这样的
let recordFetch = NSFetchRequest<NSFetchRequestResult>(entityName: table)
recordFetch.predicate = NSPredicate(format: "MyItem CONTAINS[cd] 'tem' OR MyItemIndex.MyItemStyleIndex.MyItemStyle.MyItemStyle CONTAINS[cd] 'tem' OR MyItemIndex.breweryIndex.brewery CONTAINS[cd] 'tem'")
let fetchedEmployees = try context.fetch(recordFetch)
return fetchedEmployees as! Array<NSFetchRequestResult>
我的 SQL 查询调试日志是:
SELECT DISTINCT 0, t0.Z_PK, t0.Z_OPT, t0.ZMYITEM, t0.ZMYITEMAPPEARANCEDESCRIPTION, t0.ZMYITEMAROMADESCRIPTION, t0.ZMYITEMBREWINGMETHOD, t0.ZMYITEMHISTORY, t0.ZMYITEMHOPS, t0.ZMYITEMID, t0.ZMYITEMLANGUAGEID, t0.ZMYITEMMALT, t0.ZMYITEMMOUTHFEELDESCRIPTION, t0.ZMYITEMSLOGAN, t0.ZMYITEMSUMMARY, t0.ZMYITEMTASTEDESCRIPTION, t0.ZINGREDIENTSDESCRIPTION, t0.ZISUPLOADED, t0.ZLANGUAGEID, t0.ZMYITEMINDEX, t0.ZLANGUAGE FROM ZMYITEM t0 LEFT OUTER JOIN ZMYITEMINDEX t1 ON t0.ZMYITEMINDEX = t1.Z_PK LEFT OUTER JOIN ZMYITEMSTYLEINDEX t2 ON t1.ZMYITEMSTYLEINDEX = t2.Z_PK LEFT OUTER JOIN ZMYITEMSTYLE t3 ON t2.Z_PK = t3.ZMYITEMSTYLEINDEX LEFT OUTER JOIN ZBREWERYINDEX t4 ON t1.ZBREWERYINDEX = t4.Z_PK JOIN ZLANGUAGE t5 ON t0.ZLANGUAGE = t5.Z_PK WHERE (( NSCoreDataStringSearch( t0.ZMYITEM, ?, 385, 0) OR NSCoreDataStringSearch( t3.ZMYITEMSTYLE, ?, 385, 0) OR NSCoreDataStringSearch( t4.ZBREWERY, ?, 385, 0)) AND t5.ZLANGUAGECODE = ?) ORDER BY t1.ZCURRENTAVERAGESCORE DESC LIMIT 50
是的,它现在与 contains[cd] 一起工作...可能是一些缓存问题。
谢谢
最佳答案
你可以为“变音不敏感”比较添加“d”选项, 例如
NSPredicate(format: "name CONTAINS[d] %@", givenName)
NSPredicate(format: "name ==[d] %@", givenName)
此外,您可能希望为不区分大小写添加“c”选项 搜索,例如
NSPredicate(format: "name CONTAINS[cd] %@", givenName)
有关详细信息,请参阅 String Comparisons在“谓词编程指南”中。
关于ios - CoreData 或 NSPredicate 是否像 sql 查询一样支持 COLLATE?如果是这样怎么办?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45880302/