Firestore:如何通过带有重音字符的字符串正确排序?

时间:2018-01-21 11:42:44

标签: swift firebase google-cloud-firestore

我的Firestore数据库包含带重音字符的单词,例如急性(é),代字号(ñ),变音符号(ü)和cedilla(ç)。

我已经创建了一个按此字段排序的自定义索引,但是没有正确定位带有此类字符的字词。

预期订单示例:

[“Água”,“Amigo”,“Barro”,“Casa”]

我从Firestore获得的内容:

[“Amigo”,“Barro”,“Casa”,“Água”]

我的查询是这样的:

let query = historyRef.whereField("createdByUserID", isEqualTo: state.loggedUser.uid).order(by: "itemName", descending: false)

有关如何修复它的任何指示?

提前致谢。

3 个答案:

答案 0 :(得分:1)

据我所知,Firebase没有内置选项来排序忽略变音标记。您可以做的是向对象添加foldedName属性,然后对其进行Firebase排序。要获得折叠名称,请使用

itemName.folding(options: [.diacriticInsensitive, .caseInsensitive], locale: Locale.current)

答案 1 :(得分:0)

您可以像这样订购数组:

var array = ["Amigo", "Barro", "Casa", "Água"]

array = array.sorted(by: {
    $0.lowercased().folding(options: .diacriticInsensitive, locale: .current)
        <
    $1.lowercased().folding(options: .diacriticInsensitive, locale: .current)
})

答案 2 :(得分:0)

我还遇到了一个对带有变音符号的字符串(即“Pâté”)进行排序的问题。我当时使用NSSortDescriptor对从Core Data获取的项目进行排序,但事实证明NSSortDescriptor不能很好地对这种字符串进行排序。

因此,我在没有NSSortDescriptor的情况下获取了项目数组,然后用以下方法手动对其进行了排序:

func sortArray() {
   array.sort(by: { item1, item2 in
                      
      return item1.itemName?.localizedStandardCompare((item2.itemName)!) == .orderedAscending } )
}