Comment ignorer l'accent dans la requête SQLite (Android)
je suis nouveau dans adnroid et je travaille sur une requête dans sqlite, mais le problème est quand j'utilise l'accent dans ma chaîne. Ex:
- L'
- l'
- ÀÀÀ
- ààà
- aaa
- AAA
Si je fais:
SELECT * FROM TB_MOVIE WHERE MOVIE_NAME LIKE '%a%' ORDER BY MOVIE_NAME;
Elle est de retour:
- AAA
- aaa (C'est en ignorant les autres)
Mais si je fais:
SELECT * FROM TB_MOVIE WHERE MOVIE_NAME LIKE '%à%' ORDER BY MOVIE_NAME;
C'est retour:
- ààà (en ignorant le titre "ÀÀÀ")
je veux sélectionner des cordes dans un SQLite DB sans prendre soin des accents et de l'étui. S'il vous plaît aider.
3 réponses
en général, les comparaisons de chaînes de caractères en SQL sont contrôlées par colonne ou expression COLLATE
règles. Dans Android, seulement trois séquences de collation sont prédéfinis: binaire (par défaut), localisé et UNICODE. Aucune D'entre elles n'est idéale pour votre cas d'utilisation, et l'API C pour l'installation de nouvelles fonctions de collation n'est malheureusement pas exposée dans L'API Java.
Pour contourner ce problème:
- ajouter une autre colonne à votre table, par exemple
MOVIE_NAME_ASCII
conservez les valeurs dans cette colonne sans les marques d'accent. Vous pouvez supprimer les accents en normalisant vos chaînes à la forme normale Unicode D (NFD) et en supprimant les points de code non ASCII puisque NFD représente des caractères accentués grossièrement aussi simples que ASCII + en combinant des marqueurs d'accent:
String asciiName = Normalizer.normalize(unicodeName, Normalizer.Form.NFD) .replaceAll("[^\p{ASCII}]", "");
faites vos recherches textuelles sur cette colonne normalisée ASCII mais affichez les données de la colonne unicode originale.
vous pouvez utiliser Android NDK pour recompiler La Source SQLite incluant les composants ICU (International pour Unicode). Expliqué en russe ici: http://habrahabr.ru/post/122408/
le processus de compilation du SQLilte avec source avec ICU expliqué ici:
comment compiler sqlite avec ICU?
malheureusement, vous finirez avec des Apk différents pour des CPU différents.
vous devez regarder ces, pas comme des caractères accentués, mais comme des caractères entièrement différents. Autant chercher a, b ou c. Ceci étant dit, j'essaierais d'utiliser un regex pour cela. Il ressemblerait à quelque chose comme:
SELECT * from TB_MOVIE WHERE MOVIE_NAME REGEXP '.*[aAàÀ].*' ORDER BY MOVIE_NAME;