iOS端使用sqlite.swift如何实现本地化语言排序查询?
iOS端sqlite.swift实现语言特定排序的方案
原生SQLite本身没有内置Android定制版提供的LOCALIZED排序规则,iOS平台可以通过自定义SQLite排序规则(Collation)的方式实现对应需求,具体实现方式如下:
方案1:自定义运行时排序规则(适合中小数据量场景)
sqlite.swift支持注册自定义排序规则,你可以直接结合iOS系统的Foundation字符串比较API实现符合本地语言规则的排序逻辑:
- 第一步:定义并注册自定义排序规则
import SQLite // 示例为简体中文拼音排序,可根据需求调整对应Locale let localizedCollation = Collation("LOCALIZED") { lhs, rhs in let lhsStr = lhs as NSString let rhsStr = rhs as NSString // 可根据需求调整比较参数: // .caseInsensitive 不区分大小写 // .diacriticInsensitive 不区分声调、重音 // Locale参数指定排序对应的语言区域,比如 Locale(identifier: "ja_JP") 代表日文排序 let compareResult = lhsStr.compare( rhsStr as String, options: [.caseInsensitive, .diacriticInsensitive], range: NSRange(location: 0, length: lhsStr.length), locale: Locale.current ) switch compareResult { case .orderedAscending: return .orderedAscending case .orderedSame: return .orderedSame case .orderedDescending: return .orderedDescending } } // 每次打开数据库连接后,都需要注册一次该排序规则 let db = try Connection("你的数据库文件路径") db.add(collation: localizedCollation)
- 第二步:查询时使用自定义排序规则
let MyTable = Table("MyTable") let MyStringField = Expression<String>("MyStringField") // 排序时指定自定义的排序规则即可 let sortedResult = try db.prepare(MyTable.order(MyStringField.collate(localizedCollation)))
如果是直接执行原生SQL语句,直接指定你定义的排序规则名称即可:
try db.run("Select * From MyTable ORDER BY MyStringField COLLATE LOCALIZED")
方案2:排序辅助字段(适合大数据量场景,性能更高)
如果你的表数据量很大,自定义运行时排序的性能无法满足需求,可以提前在写入数据的时候新增一个排序辅助字段:
- 写入字符串时,同步将字符串转换为对应语言的排序Key存入辅助字段
- 查询时直接按辅助字段做Binary排序即可,性能和原生排序一致
注意事项
- 自定义排序规则是和数据库连接绑定的,每次新建数据库连接都需要重新注册,否则会报找不到排序规则的错误
- 可通过修改
Locale的identifier参数,实现任意语言的本地排序规则,比如zh_HK对应繁体中文香港区排序、ko_KR对应韩文排序
内容的提问来源于stack exchange,提问作者user2417750
相关产品推荐
相关产品推荐

