Pregunta

Tengo una vista de tabla (vinculada a una base de datos) y una barra de búsqueda. Cuando escribo algo en la barra de búsqueda, hago una búsqueda rápida en la base de datos y visualizo los resultados mientras escribo.

La consulta se ve así:

SELECT * FROM MyTable WHERE name LIKE '%NAME%'

Todo funciona bien siempre y cuando solo use caracteres ASCII. Lo que quiero es escribir caracteres ASCII y hacer coincidir su equivalente con los signos diacríticos. Por ejemplo, si escribo " Alizee " Espero que coincida con " Aliz & # 233; e " ;.

¿Hay alguna manera de hacer que la consulta sea insensible al entorno? Me he dado cuenta de la opción COLLATE en SQL, pero parece que no tiene ninguna utilidad con SQLite. También me ha parecido que el iPhone SDK 3.0 tiene " Intercalación localizada " pero no pude encontrar ninguna documentación sobre lo que esto significa ...

Gracias.

¿Fue útil?

Solución

Hay algunas opciones para resolver esto:

  1. Reemplazando todos los caracteres acentuados en el consulta antes de ejecutarlo, por ejemplo

      

    " Psychédélices " = > " Psicodélices "
      " À contre-courant " = > " Un contre-courant "
      " Tempête " = > " Tempete "
      etc.

    pero esto solo funciona para la entrada asi no debes tener caracteres acentuados en la base de datos en sí. Solución simple pero lejos de ser perfecto.

  2. Uso de una biblioteca de terceros, a saber, UCI (enlaces a continuación). Aunque no estoy seguro de si es la mejor opción para iPhone.

  3. Escribiendo una o más funciones C personalizadas que harán la comparación. Más en los enlaces de abajo.

Algunas publicaciones aquí en StackOverflow que analizan las distintas opciones:
¿Cómo ordenar el texto en sqlite3 con la configuración regional especificada?
Compilación de cadenas UTF-8 que no distingue entre mayúsculas y minúsculas para SQLite (C / C ++ )
¿Cómo implementar la búsqueda insensible de acento / diacrítica en Sqlite?

También un par de enlaces externos:
SQLite y el soporte nativo de UNICODE LIKE en C / C ++
búsquedas de casos y acentos sqlite

Otros consejos

No estoy seguro acerca de SQL, pero creo que definitivamente puede usar NSDiacriticInsensitivePredicateOption para comparar NSStrings en memoria.

Un ejemplo sería una NSArray llena de las cadenas que está buscando. Puede simplemente iterar sobre la matriz comparando cadenas utilizando NSDiacriticInsensitivePredicateOption como su opción de comparación y mostrando las coincidencias exitosas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top