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.

16
demandé sur andrehsouza 2013-04-29 19:07:38

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:

  1. ajouter une autre colonne à votre table, par exemple MOVIE_NAME_ASCII
  2. 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}]", "");
    
  3. faites vos recherches textuelles sur cette colonne normalisée ASCII mais affichez les données de la colonne unicode originale.

32
répondu laalto 2013-05-02 07:15:38

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.

0
répondu BCS Software 2017-05-23 12:09:33

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;
-1
répondu Dave 2013-04-29 16:18:22