SQLite Suche

  • Antworten:8
Gelöschter Account
  • Forum-Beiträge: 2.492

08.09.2013, 13:29:49 via Website

Hallo,

ich habe glaub ich ein relativ "einfaches" Problem, komme aber nicht dahinter wie ich es lösen kann.
Also:
Mit einem Klick auf einen Button wird eine Eingabe gelesen z.B. DB
Dann soll in meiner Datenbank die Zeile ausgelesen werden in der DB als Name steht
Meine Datenbank ist so aufgebaut worden:
1db.execSQL("CREATE TABLE " + DATABASE_TABLE + " (" +
2 KEY_NAME + " TEXT NOT NULL, " +
3 KEY_1 + " TEXT NOT NULL, " +
4 KEY_2 + " TEXT NOT NULL, " +
5 KEY_3 + " TEXT NOT NULL);"
6 );
Meine "Auslesen"-Methode sieht so aus:
1Cursor c = ourDatabase.rawQuery("SELECT * FROM "+DATABASE_TABLE+" WHERE KEY_NAME like '"+suche+"'", null);
2 String result = "";
3 for(c.moveToFirst(); !c.isAfterLast(); c.moveToNext()){
4 result = result + c.getString(c.getColumnIndex(KEY_NAME));
5 }
6 return result;

"suche" ist hier das Eingebene also in dem Fall "DB"
Wenn ich dann aber auf den Button drücke wird die App beendet und folgender Fehler kommt:
1android.database.sqlite.SQLiteException: no such column: KEY_NAME: , while compiling: SELECT KEY_NAME FROM abkurztable WHERE KEY_NAME = 'DB'
Hört sich so an als wenn der die column KEY_NAME nicht findet aber die hab ich doch erstellt!?
Weiß einer von euch wo hier der Fehler liegt, oder wie ich das Problem anders lösen kann.

Grüße
Lars

— geändert am 08.09.2013, 13:42:08

Antworten
San Blarnoi
  • Forum-Beiträge: 2.545

08.09.2013, 16:42:26 via Website

"SELECT * FROM "+DATABASE_TABLE+" WHERE KEY_NAME like '"+suche+"'"

Laut create ist KEY_NAME eine Variable, also musst du sie auch hier entsprechend benutzen:

"SELECT * FROM "+DATABASE_TABLE+" WHERE "+KEY_NAME+" like '"+suche+"'"

Das "like" aus deinem Codeschnipsel hast du ja laut Fehlermeldung bereits durch ein "=" ersetzt, denn in dieser Form würde das wenig Sinn machen :)

Antworten
Carsten M.
  • Forum-Beiträge: 33.204

08.09.2013, 17:06:46 via App

and dev

Das "like" aus deinem Codeschnipsel hast du ja laut Fehlermeldung bereits durch ein "=" ersetzt, denn in dieser Form würde das wenig Sinn machen :)
Verständnisfrage: warum würde LIKE keinen Sinn machen?

Herzliche Grüße

Carsten

Ich komm' mir langsam vor wie jemand, der ich bin // #cäthe

Antworten
San Blarnoi
  • Forum-Beiträge: 2.545

08.09.2013, 19:14:22 via Website

LIKE würde grundsätzlich *selbstverständlich* Sinn machen, aber halt nicht wie im Beispiel ohne Wildcards, daher mein Zusatz "in dieser Form".

Antworten
Carsten M.
  • Forum-Beiträge: 33.204

08.09.2013, 19:23:37 via App

and dev
LIKE würde grundsätzlich *selbstverständlich* Sinn machen, aber halt nicht wie im Beispiel ohne Wildcards, daher mein Zusatz "in dieser Form".
Hmm, Wildcards sind da doch eigentlich gar nicht erforderlich...!?

Also zumindest mache ich das ohne und es funktioniert problemlos. Die Abfrage findet dann alle Datensätze, die im abgefragten Feld einen Wert enthalten, in dem der Suchbegriff vorkommt...

Herzliche Grüße

Carsten

Ich komm' mir langsam vor wie jemand, der ich bin // #cäthe

Antworten
San Blarnoi
  • Forum-Beiträge: 2.545

08.09.2013, 23:28:17 via Website

Ich habe den LIKE Operator bislang stets nach Doku verwendet, und aus anderen SQL-Dialekten ist mir nicht bekannt, das man die Wildcards auch weglassen kann, um etwa ein Ergebnis wie bei CONTAINING (Firebird) zu erhalten.

Ein Test am PC mit einer SQLite-Console ergab ebenfalls, das Weglassen der Wildcards nicht das erwünschte Ergebnis liefert...
Vielleicht bastelt deine Basic-Laufzeitumgebung an deinen Statements, damit sie wie gewünscht funktionieren?

Antworten
Carsten M.
  • Forum-Beiträge: 33.204

09.09.2013, 05:43:02 via App

Nee, hast absolut recht...

Läuft bei Basic4Android genauso und ich hatte eh reines SQL im Kopf. Allerdings war ich wohl gnadenlos verwirrt und habe da irgendwas verwechselt. Selbstverständlich habe auch ich stets in solchen Fällen Wildcards % benutzt...

Nehme also alles zurück und behaupte das Gegenteil. :-)

Herzliche Grüße

Carsten

Ich komm' mir langsam vor wie jemand, der ich bin // #cäthe

Antworten
San Blarnoi
  • Forum-Beiträge: 2.545

09.09.2013, 11:27:25 via Website

Nehme also alles zurück und behaupte das Gegenteil. :-)

OK :)

Zum ursprünglichen Problem vielleicht noch ein paar Anmerkungen:

WHERE KEY_NAME = 'DB'

In den meisten SQL-Dialekten ist "=" case sensitive, so auch bei SQLite, d.h. obiges würde fehlschlagen, wenn der User "db" eingibt und in der Tabelle "DB" steht;
daher würde ich in solchen Situationen das Suchpattern in Großbuchstaben wandeln und das Statement abwandeln zu
...upper(key_name)=pattern
Bei Verwendung von Umlauten funktioniert es dann zwar immer noch nicht (sofern die in der Tabelle klein geschrieben wurden), aber das hat der Hersteller der Datenbank ja unter Kontrolle.

Außerdem (vielleicht noch wichtiger) produziert diese Formulierung eine Exception, wenn der User einfache Anführungszeichen ("'") in sein Pattern schreibt, diese Zeichen sollten also vor dem Einfügen in das Statement gequotet werden.

Antworten
Gelöschter Account
  • Forum-Beiträge: 2.492

09.09.2013, 13:26:12 via Website

Okay danke hat geklappt und das mit der Groß/Kleinschreibung ist auch noch ein guter Hinweis das brauch ich nämlich auch :)

Antworten