2010-08-13 16 views
11

Lors de la création de ma base de données SQLite dans Android, j'ai défini les paramètres régionaux de la base de données - db.setLocale (new Locale ("cz_CZ")). Ceci est un lieu tchèque.Utilisation de COLLATE dans Android SQLite - Les paramètres régionaux sont ignorés dans l'instruction LIKE

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 LIKE échouera:

SELECT * from table WHERE name LIKE '%sctzy%' COLLATE LOCALIZED 

Aucune ligne est renvoyée.

BTW. Il n'y a pas de classe java.text.Normalized dans Android. Je pensais pouvoir faire une deuxième colonne avec un texte normalisé, dépouillé de caractères spéciaux, qui serait utilisé pour la recherche - mais il me manque une classe ou un moyen de normaliser la chaîne.

+0

J'ai trouvé une réponse partielle: http://stackoverflow.com/questions/3211974/transforming-some-special-caracters-ee-into-e Mais c'est seulement comment supprimer accents. Je devrais faire une colonne en double dans ma base de données avec un texte normalisé ... N'y a-t-il pas un meilleur moyen? –

Répondre

7

Avez-vous regardé le SQLite documentation for LIKE? Il est venu des informations sur les caractères non ASCII et un bug. Peut-être qu'Android a une ancienne version de SQLite installée là où c'est un problème.

Je pense que la deuxième colonne normalisée pourrait être votre meilleure option malheureusement.

+0

Comment puis-je créer une colonne normalisée? – sealskej

0

est peut-être du temps, mais vous pouvez utiliser le java.text.Normalizer comme ici

Converting Symbols, Accent Letters to English Alphabet

Comme ne fait pas partie du sous-ensemble de Java Android, vous pouvez essayer de chercher à la code de java, telles que Normalizer.java Avec le Javadoc trouvé here:

et copier la partie du code nécessaire à l'intérieur de votre projet.

Espérons que cela fonctionne!

2

La création d'une seconde colonne normalisée peut être utilisée pour contourner les limitations (comme mentionné brièvement dans d'autres réponses). Cela signifie en pratique que vous devez créer une autre colonne (ombre) de votre première où les mêmes données dans un cas fixe (par exemple tous les caractères supérieurs) sont stockées. Les requêtes insensibles à la casse (y compris les requêtes similaires) 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
aaa
ÉÉÉ

La deuxième colonne a_shadow contiendrait pour la même rangées

AAA
AAA
BBB
aaa
ÉÉÉ

et votre requête d'origine (par exemple) "sélectionner un de mytable où a = 'aaa'"
serait remplacé par "select a from mytable où A = 'ÄÄ'"

Votre code doit être mis à jour pour remplir le contenu masqué converti lors de l'ajout du contenu principal. Si la colonne est ajoutée après la création ou si vous ne pouvez pas modifier le code, vous devrez peut-être convertir les valeurs existantes à l'aide d'une requête de mise à jour. Exemple:

UPDATE mytable SET a_shadow=UPPER(a);