2012-04-11 13 views
0

Ich Abfrage SQLite von Android mit Cursor auf folgende WeiseWie suche ich in SQLite w.r.t eine Zeichenkette mit einfachem Anführungszeichen und doppelten Anführungszeichen in Android?

Cursor searchCusor = getCursorForSearchQuery(str); 

wo str eine Zeichenfolge ist. Diese Zeichenfolge kann einfache Anführungszeichen und doppelte Anführungszeichen enthalten. Also, wenn der Cursor zu suchen versucht es eine Ausnahme auslöst

04-12 17:32:11.961: E/AndroidRuntime(2337): FATAL EXCEPTION: main 
04-12 17:32:11.961: E/AndroidRuntime(2337): android.database.sqlite.SQLiteException: unrecognized token: "' AND latitude != 0 AND longitude != 0 ORDER BY title ASC": , while compiling: SELECT _id, title FROM node WHERE title LIKE '%'%' AND latitude != 0 AND longitude != 0 ORDER BY title ASC 
04-12 17:32:11.961: E/AndroidRuntime(2337):  at android.database.sqlite.SQLiteCompiledSql.native_compile(Native Method) 
04-12 17:32:11.961: E/AndroidRuntime(2337):  at android.database.sqlite.SQLiteCompiledSql.compile(SQLiteCompiledSql.java:91) 
04-12 17:32:11.961: E/AndroidRuntime(2337):  at android.database.sqlite.SQLiteCompiledSql.<init>(SQLiteCompiledSql.java:64) 
04-12 17:32:11.961: E/AndroidRuntime(2337):  at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:80) 
04-12 17:32:11.961: E/AndroidRuntime(2337):  at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:46) 
04-12 17:32:11.961: E/AndroidRuntime(2337):  at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:53) 
04-12 17:32:11.961: E/AndroidRuntime(2337):  at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1412) 
04-12 17:32:11.961: E/AndroidRuntime(2337):  at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1296) 
04-12 17:32:11.961: E/AndroidRuntime(2337):  at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1251) 
04-12 17:32:11.961: E/AndroidRuntime(2337):  at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1331) 
04-12 17:32:11.961: E/AndroidRuntime(2337):  at com.mid.kew.apies.KewDatabaseHelper.getCursorForSearchMapPage(KewDatabaseHelper.java:285) 
04-12 17:32:11.961: E/AndroidRuntime(2337):  at com.mid.kew.activities.MapFragment.getCursorForSearchQuery(MapFragment.java:538) 
04-12 17:32:11.961: E/AndroidRuntime(2337):  at com.mid.kew.activities.MapFragment.access$12(MapFragment.java:537) 
04-12 17:32:11.961: E/AndroidRuntime(2337):  at com.mid.kew.activities.MapFragment$6.afterTextChanged(MapFragment.java:348) 
04-12 17:32:11.961: E/AndroidRuntime(2337):  at android.widget.TextView.sendAfterTextChanged(TextView.java:6271) 
04-12 17:32:11.961: E/AndroidRuntime(2337):  at android.widget.TextView$ChangeWatcher.afterTextChanged(TextView.java:6454) 
04-12 17:32:11.961: E/AndroidRuntime(2337):  at android.text.SpannableStringBuilder.sendTextHasChanged(SpannableStringBuilder.java:903) 
04-12 17:32:11.961: E/AndroidRuntime(2337):  at android.text.SpannableStringBuilder.change(SpannableStringBuilder.java:359) 
04-12 17:32:11.961: E/AndroidRuntime(2337):  at android.text.SpannableStringBuilder.change(SpannableStringBuilder.java:275) 
04-12 17:32:11.961: E/AndroidRuntime(2337):  at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:438) 
04-12 17:32:11.961: E/AndroidRuntime(2337):  at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:415) 
04-12 17:32:11.961: E/AndroidRuntime(2337):  at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:28) 
04-12 17:32:11.961: E/AndroidRuntime(2337):  at android.view.inputmethod.BaseInputConnection.replaceText(BaseInputConnection.java:583) 
04-12 17:32:11.961: E/AndroidRuntime(2337):  at android.view.inputmethod.BaseInputConnection.commitText(BaseInputConnection.java:174) 
04-12 17:32:11.961: E/AndroidRuntime(2337):  at com.android.internal.widget.EditableInputConnection.commitText(EditableInputConnection.java:120) 
04-12 17:32:11.961: E/AndroidRuntime(2337):  at com.android.internal.view.IInputConnectionWrapper.executeMessage(IInputConnectionWrapper.java:247) 
04-12 17:32:11.961: E/AndroidRuntime(2337):  at com.android.internal.view.IInputConnectionWrapper$MyHandler.handleMessage(IInputConnectionWrapper.java:73) 
04-12 17:32:11.961: E/AndroidRuntime(2337):  at android.os.Handler.dispatchMessage(Handler.java:99) 
04-12 17:32:11.961: E/AndroidRuntime(2337):  at android.os.Looper.loop(Looper.java:144) 
04-12 17:32:11.961: E/AndroidRuntime(2337):  at android.app.ActivityThread.main(ActivityThread.java:4937) 
04-12 17:32:11.961: E/AndroidRuntime(2337):  at java.lang.reflect.Method.invokeNative(Native Method) 
04-12 17:32:11.961: E/AndroidRuntime(2337):  at java.lang.reflect.Method.invoke(Method.java:521) 
04-12 17:32:11.961: E/AndroidRuntime(2337):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
04-12 17:32:11.961: E/AndroidRuntime(2337):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
04-12 17:32:11.961: E/AndroidRuntime(2337):  at dalvik.system.NativeStart.main(Native Method) 

ich die einfachen Anführungszeichen versucht zu ersetzen als

str.replace("'", "\' "); 

folgt Aber das funktionierte nicht und gab den gleichen Fehler

Antwort

1

Sie habe nicht gezeigt, was Ihre Methode tut, aber meine Vermutung ist, dass es nur den Wert direkt in der SQL enthält. Tu das nicht. Verwenden Sie eine parametrisierte SQL-Abfrage mit PreparedStatement, und alles sollte gut sein. Ihr aktueller Fehler wird nicht nur verschwinden, Sie haben auch eine SQL Injection Attacke-Sicherheitslücke geschlossen, und Sie sind besser in der Lage, andere Datentypen ohne Konvertierungsprobleme zu verarbeiten.

+0

Hallo Danke für die Hilfe ... Dies ist, was die Methode myDatabase.query ("Knoten", neue String [] {"_ ID", "Titel"}, "Titel LIKE \ '%" + StringToSearch + "% \ 'UND Breite! = 0 UND Länge! = 0", Null, Null, Null, "Titel ASC"); Kannst du bitte ein Beispiel dafür geben, was du mir vorgeschlagen hast? – Nik

+0

@Raj: Siehe http://developer.android.com/reference/java/sql/PreparedStatement.html und verwandte Themen. –

+0

Nochmals vielen Dank ... Ich versuchte die folgende Zeile und es funktionierte ... myDatabase.rawQuery ("SELECT _id, Titel FROM Knoten WHERE Titel wie? UND Breite! = 0 und Länge! = 0 ORDER BY Titel ASC", neu String [] {"%" + StringToSearch + "%"}); ist das, was Sie in Ihrer Antwort – Nik

0

habe ich vorher die folgende Anweisung

myDatabase.query("node", new String[]{"_id","title"}, "title LIKE \'%" + stringToSearch +"%\' AND latitude != 0 AND longitude != 0" ,null, null,null, "title ASC"); 

die das Problem habe ich

erwähnt

So modifizierte ich die Abfrage

myDb.query("node", new String[]{"_id","title"}, "title LIKE ? AND latitude != 0 AND longitude != 0" ,new String[]{"%"+stringToSearch+"%"}, null,null, "title ASC"); 

und es funktioniert jetzt gut.