Utilisation de COLLATE dans Android SQLite - Les paramètres régionaux sont ignorés dans l'instruction LIKE
Lors de la création de ma base de données SQLite sous Android j'ai mis la base de données locale - db.setLocale(new Locale("cz_CZ")). C'est un tchèque locale.
Une instruction SELECT fonctionne et prend les paramètres régionaux en compte, par exemple:
SELECT * from table WHERE name='sctzy' COLLATE LOCALIZED
Trouverez l'entrée 'ščťžý'.
Mais en utilisant COMME échouera:
SELECT * from table WHERE name LIKE '%sctzy%' COLLATE LOCALIZED
Aucune ligne n'est renvoyée.
BTW. Il n'y a pas de java.texte.Normalisé classe dans Android. Je pensais que je pouvais faire une deuxième colonne avec un normalisée texte, dépouillé de caractères spéciaux, qui serait utilisé pour la recherche - mais il me manque une classe ou une façon de normaliser la Chaîne.
source d'informationauteur Daniel Novak
Vous devez vous connecter pour publier un commentaire.
Avez-vous eu un coup d'oeil à la SQLite documentation COMME? Il est venu d'informations sur les caractères non ASCII et un bug. Peut-être que Android a une ancienne version de SQLite installé où c'est un problème.
Je pense que la deuxième normalisés colonne peut être votre meilleure option malheureusement.
La création d'un deuxième normalisés colonne peut être utilisée pour contourner les limitations (comme mentionné brièvement dans d'autres réponses).
En pratique, cela signifie que vous devez créer une autre (de l'ombre) de la colonne de votre première où les mêmes données dans un cas (par exemple, tous les haut caractères) est stockée. Insensible à la casse des requêtes (y compris comme les requêtes peuvent être effectuées sur cette nouvelle colonne avec des valeurs de recherche dans le même cas.
Si la première colonne "a" contient
AAA
aaa
Bbb
äää
ééé
La deuxième colonne a_shadow contiendrait pour les mêmes lignes
AAA
AAA
BBB
ÄÄÄ
ÉÉÉ
et de votre requête initiale (exemple) "select a from mytable where a='äää'"
serait remplacé par "select a from mytable where A='ÄÄÄ'"
Votre code doit être mis à jour pour combler les convertis de l'ombre de contenu lors de l'ajout du contenu principal.
Si la colonne est ajoutée après la création ou vous ne pouvez pas modifier le code de valeurs existantes doivent être convertis à l'aide d'une requête de mise à jour. Exemple:
UPDATE mytable SET a_shadow=UPPER(a);
Peut-être beaucoup de temps, mais vous pouvez utiliser le java.texte.Normalisateur comme ici
La conversion des Symboles, des Accents de Lettres à l'Alphabet anglais
Que ce n'est pas une partie du sous-ensemble de java Android, vous pouvez essayer de chercher dans le code de java, comme Normalizer.java
Avec la Javadoc trouvé ici:
Et la copie de la partie du code nécessaire à l'intérieur de votre projet.
Espère que ça fonctionne!