2017-01-05 3 views
0

Ich schreibe eine Funktion für eine Android-App, die die ersten 8 Einträge (Namen der Städte) einer Datenbank erhalten soll, die eine Zeichenfolge entsprechen.Verwenden von LIKE und LIMIT in sqlite Abfragen in Android

Dies ist meine Frage:

Cursor cursor = database.rawQuery(
       "SELECT " + CITIES_NAME + 
         " FROM " + TABLE_CITIES + 
         " WHERE " + CITIES_NAME + 
         " LIKE " + String.format("%s%%", nameLetters) + 
         " LIMIT " + 8 
         , null); 

Dies ist der resultierende Fehler:

android.database.sqlite.SQLiteException: near "LIMIT": syntax error (code 1): , while compiling: SELECT city_name FROM CITIES WHERE city_name LIKE berl% LIMIT 8 

Ich habe bereits andere Fragen auf der Plattform ausgecheckt, konnte aber keine Lösung mir nicht finden helfen. Die Datenbank wird korrekt getestet und erstellt und der Sucheintrag befindet sich in der Datenbank.

Kann jemand helfen?

+0

Funktioniert es ohne das Bit '=?'? – Isaac

+0

Danke, ich habe es entfernt (siehe Update oben). Aber das Problem ist immer noch vorhanden. – Yonjuni

+3

Ich denke, Sie brauchen Zitate um die gleiche Zeichenfolge zB LIKE 'berl%' LIMIT 8 – Isaac

Antwort

3

WARNUNG: Sie sollten nicht String-Verkettung mit dem Operator + verwenden, um Benutzereingabe in einer SQL query.This läßt Ihre App öffnen, um einen SQL-Injection-Angriff einzufügen. Ich kann das nicht genug betonen. Die Behebung dieses häufigen Sicherheitsdefizits sollte für alle Datenbankentwickler oberste Priorität haben.

Stattdessen sollten Sie die ? Platzhalter Syntax:

String query = "SELECT " + CITIES_NAME + 
        " FROM " + TABLE_CITIES + 
        " WHERE " + CITIES_NAME + 
        " LIKE ?" + 
        " LIMIT 8"; 
String[] args = {nameLetters + "%%"}; 
Cursor cursor = database.rawQuery(query, args); 

Auch wenn die Datenbank klein ist und nur für Ihre individuelle Anwendung verwendet wird, ist es am besten machen dies zu einer Gewohnheit Syntax. Wenn Sie dann an größeren, kritischeren Datenbanken arbeiten, müssen Sie sich nicht so sehr um dieses Problem kümmern.

Dies hat auch den Vorteil, dass es die Eingabe für Sie anführt. Sie vermeiden vollständig den Fehler, der die ursprüngliche Frage ausgelöst hat.

+0

Sollte nicht das ", null);" entfernt werden? – Yonjuni

+0

@Yonjuni Ja, das ist mir gerade aufgefallen. Es ist jetzt behoben. (Ihre vorgeschlagene Bearbeitung hätte genehmigt werden sollen. Ich habe es nicht bald genug gesehen, um selbst aktiv zu werden und andere Moderatoren haben es abgelehnt.) –

+0

Was ist mit 'ContentValues'? –

2

Der Vollständigkeit halber werde ich meinen Kommentar in eine Antwort verwandeln, um hoffentlich anderen zu helfen, die dieses Problem haben könnten.

Think you need quotes around the like string eg SELECT city_name FROM CITIES WHERE city_name LIKE 'berl%' LIMIT 8

Verwandte Themen