Mithilfe der COLLATE-in Android SQLite - Locales wird ignoriert in der LIKE-Anweisung
Beim erstellen meiner SQLite Datenbank in der Android ich habe die Datenbank-locale - db.setLocale(new Locale("cz_CZ")). Dies ist eine Tschechische Gebietsschema.
Einer SELECT-Anweisung funktioniert und nimmt das Gebietsschema berücksichtigt werden, zum Beispiel:
SELECT * from table WHERE name='sctzy' COLLATE LOCALIZED
Finden Sie den Eintrag 'ščťžý'.
Aber WIE wird fail:
SELECT * from table WHERE name LIKE '%sctzy%' COLLATE LOCALIZED
Wird keine Zeile zurückgegeben.
BTW. Es ist kein java.text.Normalisiert Klasse in Android. Ich dachte, ich könnte eine zweite Spalte mit einer normalisierten text, ohne spezielle Zeichen, die verwendet werden würde, für die Suche - aber ich bin fehlt eine Klasse oder die Art und Weise, wie Sie zu normalisieren, die String.
Ich fand eine partielle Antwort hier: stackoverflow.com/questions/3211974/..., Aber das ist nur, wie zu entfernen Akzenten. Ich würde eine doppelte Spalte in meiner Datenbank mit einem normalisierten text... gibt es nicht einen besseren Weg?
InformationsquelleAutor Daniel Novak | 2010-08-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben Sie schon einen Blick auf die SQLite-Dokumentation für WIE? Es kommen Informationen über nicht-ASCII-Zeichen und ein bug. Vielleicht Android hat eine ältere version von SQLite installiert, wo das ein problem ist.
Ich denke, dass die zweite normiert Spalte könnte Ihre beste option, leider.
InformationsquelleAutor matto1990
Erstellen einer zweiten normalisiert Spalte kann verwendet werden, um zu gehen Einschränkungen (wie kurz erwähnt, in anderen Antworten).
In der Praxis bedeutet dies, dass Sie haben, um ein anderes (Schatten -) Spalte der ersten, wo die gleichen Daten in einem festen Gehäuse (z.B. alle oberen chars) gespeichert ist. Groß-und Kleinschreibung Abfragen (einschließlich wie-Abfragen) gemacht werden können, auf diese neue Spalte mit such-Werte in die gleiche Falle.
Wenn die erste Spalte "a" enthält
AAA
aaa
Bbb
äää
ééé
Die zweite Spalte a_shadow enthalten würde, für die gleichen Zeilen
AAA
AAA
BBB
ÄÄÄ
ÉÉÉ
und Ihre ursprüngliche Abfrage (Beispiel) "select a from mytable where a='äää'"
würde ersetzt werden, mit "select a from mytable where A='ÄÄÄ'"
Muss der code aktualisiert werden, um füllen Sie das konvertiert shadow-Inhalte, wenn Sie den primären Inhalt.
Wenn die Spalte eingefügt wird, die nach dem anlegen oder Sie können den code ändern, der bestehende Werte können Umgerechnet werden müssen, werden mithilfe einer update-Abfrage. Beispiel:
UPDATE mytable SET a_shadow=UPPER(a);
InformationsquelleAutor Lmickos
Könnte zeitaufwändig sein, aber Sie können die java.text.Normalizer wie hier
Umwandlung von Symbolen, Akzent-Buchstaben Englisch Alphabet
Als ist nicht Teil der java-Teilmenge, Android, Sie können versuchen, zu suchen, die sich auf den code, der von java, wie zum Beispiel Normalizer.java
Mit der Javadoc gefunden hier:
Und kopieren Sie den Teil des Codes, der benötigt in Ihrem Projekt.
Hoffe, es funktioniert!
InformationsquelleAutor viridis
Gerade heute hatte ich genau die gleiche Aufgabe wie du hatte. Und in meiner situation machen zusätzliche Schatten Spalten ist nicht ein Fall, da bin ich zu suchen Sie nach mehr als einer Spalte. So kam ich auf die Lösung wie diese, die getestet im realen Projekt. In meinem Fall bin ich die Handhabung nur Kleinbuchstaben, aber Sie können erweitern die Funktion mit Großbuchstaben als gut.
InformationsquelleAutor asat