2010-08-13 11 views
11

Beim Erstellen meiner SQLite-Datenbank in Android habe ich das Datenbankgebietsschema - db.setLocale (neues Gebietsschema ("cz_CZ")) festgelegt. Dies ist ein tschechischer Gebietsschema.Verwenden von COLLATE in Android SQLite - Locales wird in LIKE-Anweisung ignoriert

Eine SELECT-Anweisung funktioniert und nimmt das Gebietsschema berücksichtigt, zum Beispiel:

SELECT * from table WHERE name='sctzy' COLLATE LOCALIZED 

wird der Eintrag 'ščťžý' gefunden.

Aber mit LIKE fehl:

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

Keine Zeile zurückgegeben wird.

BTW. Es gibt keine java.text.Normalized-Klasse in Android. Ich dachte, ich könnte eine zweite Spalte mit einem normalisierten Text erstellen, ohne Sonderzeichen, der für die Suche verwendet würde - aber ich vermisse eine Klasse oder einen Weg, wie man den String normalisiert.

+0

ich hier eine Teilantwort gefunden: http://stackoverflow.com/questions/3211974/transforming-some-special-caracters-ee-into-e Aber das ist nur, wie zu entfernen Akzente. Ich müsste eine doppelte Spalte in meiner Datenbank mit einem normalisierten Text machen ... Gibt es keinen besseren Weg? –

Antwort

7

Haben Sie sich die SQLite documentation for LIKE angesehen? Es sind Informationen über Nicht-ASCII-Zeichen und einen Fehler gekommen. Vielleicht hat Android eine ältere Version von SQLite installiert, wo dies ein Problem ist.

Ich denke, dass die zweite normalisierte Spalte unglücklicherweise die beste Option sein könnte.

+0

Wie kann ich eine normalisierte Spalte erstellen? – sealskej

0

könnte zeitaufwändig sein, aber Sie die java.text.Normalizer wie hier

Converting Symbols, Accent Letters to English Alphabet

Als nicht Teil der Java-Teilmenge ist, dass Android verwenden, können Sie bei der es suchen können versuchen, Code von Java, wie Normalizer.java Mit dem Javadoc gefunden here:

Und kopieren Sie den Teil des Codes benötigt in Ihrem Projekt.

Ich hoffe, es funktioniert!

2

Das Erstellen einer zweiten normalisierten Spalte kann verwendet werden, um Beschränkungen zu umgehen (wie kurz in anderen Antworten erwähnt).

Dies bedeutet in der Praxis, dass Sie eine andere (Schatten-) Spalte Ihrer ersten erstellen müssen, in der dieselben Daten in einem festen Fall (z. B. alle oberen Zeichen) gespeichert sind. Groß-/Kleinschreibung-unabhängige Abfragen (einschließlich ähnlicher Abfragen) können in dieser neuen Spalte mit Suchwerten in demselben Fall durchgeführt werden.

Wenn die erste Spalte "a" enthält

AAA
aaa
Bbb
ÄÄÄ
ééé

Die zweite Spalte a_shadow für denselben enthalten würde Zeilen

AAA
AAA
BBB
ÄÄÄ
ÉÉÉ

und Ihre ursprüngliche Abfrage (Beispiel) "wählen Sie eine von mytable wo ein 'AAA' ="
würde ersetzt werden mit "Wählen Sie eine von meiner Tabelle, wobei A = 'ÄÄÄ'"

Ihr Code muss aktualisiert werden, um den konvertierten Schatteninhalt zu füllen, wenn der primäre Inhalt hinzugefügt wird. Wenn die Spalte nach der Erstellung hinzugefügt wird oder Sie den Code nicht ändern können, müssen möglicherweise vorhandene Werte mithilfe einer Aktualisierungsabfrage konvertiert werden. Beispiel:

UPDATE mytable SET a_shadow=UPPER(a);