FMDB: Sentencia SQLite ORDER BY ordera incorrectamente los diacríticos

Soy muy nuevo en el desarrollo de iOS y hay mucho que aprender. Es como una gran montaña, pero gracias a toda tu ayuda estoy recibiendo lugares;)

He comenzado un Xcode Project (Xcode Versión 6.1.1, Swift, iOS) e incluido FMDB para ejecutar consultas SQLite. Las consultas se ejecutan muy bien, sin embargo, en la siguiente statement:

var resultSet: FMResultSet! = shanetworkingInstance.database!.executeQuery("SELECT * FROM spesenValues ORDER BY country ASC", withArgumentsInArray: nil) 

El order alfabético es erróneo desde mi punto de vista, pero no parece entender cómo solucionarlo. Los caracteres AZ estándar se orderan, donde los esperaba, pero cualquier carácter que contenga un símbolo diacrítico, por ejemplo, ÄÖÜ está orderado al final de la list.

Entonces, lo que espero es:

Österreich … Zypern

Pero lo que obtengo es

Zypern … Österreich

De order SQLite Por umlauts de lugares y caracteres especiales al final aprendí que es por el hecho de que "SQLite en iOS no viene con ICU habilitado".

¿Hay una forma fácil de configurar el FMDB para ayudarme a orderar esto "correctamente"? Gracias de antemano y lo siento si esto se convierte en una pregunta super tonta

Puede definir su propia function SQLite que utiliza CFStringTransform para eliminar los acentos. Usando FMDB 2.7:

 db.makeFunctionNamed("unaccented", arguments: 1) { context, argc, argv in guard db.valueType(argv[0]) == .text || db.valueType(argv[0]) == .null else { db.resultError("Expected string parameter", context: context) return } if let string = db.valueString(argv[0])?.folding(options: .diacriticInsensitive, locale: nil) { db.resultString(string, context: context) } else { db.resultNull(context: context) } } 

A continuación, puede utilizar esta nueva function unaccented en su SQL:

 do { try db.executeQuery("SELECT * FROM spesenValues ORDER BY unaccented(country) ASC" values: nil) while rs.next() { // do what you want with results } rs.close() } else { NSLog("executeQuery error: %@", db.lastErrorMessage()) } 

Sugiere que desee replace "ä", "ö" y "ü" con "ae", "oe" y "ue", respectivamente. Esto generalmente solo se hace con los nombres propios y los nombres geocharts (consulte la input de Wikipedia para la ortografía alemana ), pero si desea hacer eso, tenga su function personalizada (a la que he cambiado el nombre de "orderar") reemplace estos valores según corresponda:

 db.makeFunctionNamed("sortstring", arguments: 1) { context, argc, argv in guard argc == 1 && (db.valueType(argv[0]) == .text || db.valueType(argv[0]) == .null) else { db.resultError("Expected string parameter", context: context) return } let replacements = ["ä": "ae", "ö": "oe", "ü": "ue", "ß": "ss"] var string = db.valueString(argv[0])!.lowercased() for (searchString, replacement) in replacements { string = string.replacingOccurrences(of: searchString, with: replacement) } db.resultString(string.folding(options: .diacriticInsensitive, locale: nil), context: context) } 

Por cierto, dado que está usando esto solo para orderar, probablemente también quiera convertir esto a minúsculas, para que los valores de mayúsculas y minúsculas no estén separados de los valores de minúsculas.

Pero la idea es la misma, defina la function que desee para orderar y, a continuación, puede usar makeFunctionNamed de makeFunctionNamed para que esté disponible en SQLite.