Select 具有多个 where 子句的字段
Select a field with multiple where clause
我需要 select 具有多个 where 子句的字段。以下查询导致语法错误。
String selectquery="SELECT" +KEY_EXPAMT+ "FROM" +TABLE_EXP+ "WHERE"
+KEY_EXPCAT+ "='" +String.valueOf(cat)+ "'AND " +KEY_EXPMONTH+ "='"
+String.valueOf(month)+ "' AND " +KEY_EXPYEAR+ "='" +String.valueOf(year)+ "'
AND " +KEY_EXPFROM+ "='" +String.valueOf(from)+"'";
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = db.rawQuery(selectquery, new String[]{cat, month,year,from});
logcat:
03-20 15:01:36.606 19106-19125/com.expense.javed.expensetrackingsystem D/OpenGLRenderer﹕ Render dirty regions requested: true
03-20 15:01:36.623 19106-19106/com.expense.javed.expensetrackingsystem D/Atlas﹕ Validating map...
03-20 15:01:36.680 19106-19125/com.expense.javed.expensetrackingsystem I/Adreno-EGL﹕ : EGL 1.4 QUALCOMM build: AU_LINUX_ANDROID_LA.BF.1.1.04.04.02.162.107_msm8226_LA.BF.1.1__release_AU ()
OpenGL ES Shader Compiler Version: E031.25.01.03
Build Date: 10/28/14 Tue
Local Branch:
Remote Branch: quic/l_LNX.LA.3.6
Local Patches: NONE
Reconstruct Branch: AU_LINUX_ANDROID_LA.BF.1.1.04.04.02.162.107 + cb93e16 + f50fe49 + d7c18e6 + 5b9a565 + 0f3a25d + 607156e + 75511aa + e4d16c0 + 686f3eb + 211a271 + dd281ee + NOTHING
03-20 15:01:36.683 19106-19125/com.expense.javed.expensetrackingsystem I/OpenGLRenderer﹕ Initialized EGL, version 1.4
03-20 15:01:36.762 19106-19125/com.expense.javed.expensetrackingsystem D/OpenGLRenderer﹕ Enabling debug mode 0
03-20 15:01:48.482 19106-19106/com.expense.javed.expensetrackingsystem I/Choreographer﹕ Skipped 30 frames! The application may be doing too much work on its main thread.
03-20 15:01:48.494 19106-19125/com.expense.javed.expensetrackingsystem V/RenderScript﹕ Application requested CPU execution
03-20 15:01:48.507 19106-19125/com.expense.javed.expensetrackingsystem V/RenderScript﹕ 0xb862fc90 Launching thread(s), CPUs 4
03-20 15:02:13.932 19106-19106/com.expense.javed.expensetrackingsystem E/SQLiteLog﹕ (1) near "SELECTexpenseamountFROMexpenseWHEREexpensecategory": syntax error
03-20 15:02:13.946 19106-19106/com.expense.javed.expensetrackingsystem D/AndroidRuntime﹕ Shutting down VM
03-20 15:02:13.962 19106-19106/com.expense.javed.expensetrackingsystem E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.expense.javed.expensetrackingsystem, PID: 19106
android.database.sqlite.SQLiteException: near "SELECTexpenseamountFROMexpenseWHEREexpensecategory": syntax error (code 1): , while compiling: SELECTexpenseamountFROMexpenseWHEREexpensecategory='food'AND expensemonth='march' AND expenseyear='2015' AND expensefrom='InBank'
at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:889)
at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:500)
at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
at android.database.sqlite.SQLiteProgram.(SQLiteProgram.java:58)
at android.database.sqlite.SQLiteQuery.(SQLiteQuery.java:37)
at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:44)
at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1316)
at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1255)
at com.expense.javed.expensetrackingsystem.SqlLiteDb.updateExpense(SqlLiteDb.java:122)
at com.expense.javed.expensetrackingsystem.ExpensingAmountActivity.onClick(ExpensingAmountActivity.java:145)
at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:160)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5312)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696)
03-20 15:02:15.674 19106-19106/com.expense.javed.expensetrackingsystem I/Process﹕ Sending signal. PID: 19106 SIG: 9
03-20 15:02:16.502 20366-20387/com.expense.javed.expensetrackingsystem D/OpenGLRenderer﹕ Render dirty regions requested: true
03-20 15:02:16.518 20366-20366/com.expense.javed.expensetrackingsystem D/Atlas﹕ Validating map...
03-20 15:02:16.576 20366-20387/com.expense.javed.expensetrackingsystem I/Adreno-EGL﹕ : EGL 1.4 QUALCOMM build: AU_LINUX_ANDROID_LA.BF.1.1.04.04.02.162.107_msm8226_LA.BF.1.1__release_AU ()
OpenGL ES Shader Compiler Version: E031.25.01.03
Build Date: 10/28/14 Tue
Local Branch:
Remote Branch: quic/l_LNX.LA.3.6
Local Patches: NONE
Reconstruct Branch: AU_LINUX_ANDROID_LA.BF.1.1.04.04.02.162.107 + cb93e16 + f50fe49 + d7c18e6 + 5b9a565 + 0f3a25d + 607156e + 75511aa + e4d16c0 + 686f3eb + 211a271 + dd281ee + NOTHING
03-20 15:02:16.578 20366-20387/com.expense.javed.expensetrackingsystem I/OpenGLRenderer﹕ Initialized EGL, version 1.4
03-20 15:02:16.609 20366-20387/com.expense.javed.expensetrackingsystem D/OpenGLRenderer﹕ Enabling debug mode 0
不要那样做。您的代码容易受到 SQL 注入攻击。你真的应该使用准备好的语句吗?值的占位符,然后稍后设置值。或者,至少,您应该正确地转义字符串。要了解 SQL 注入,请参阅 http://en.wikipedia.org/wiki/SQL_injection
然而,至于你的错误,我认为这说明了一切:
"SELECTexpenseamountFROMexpenseWHEREexpensecategory='food'AND expensemonth='march' AND expenseyear='2015' AND expensefrom='InBank'"
您的查询中缺少空格。
我需要 select 具有多个 where 子句的字段。以下查询导致语法错误。
String selectquery="SELECT" +KEY_EXPAMT+ "FROM" +TABLE_EXP+ "WHERE"
+KEY_EXPCAT+ "='" +String.valueOf(cat)+ "'AND " +KEY_EXPMONTH+ "='"
+String.valueOf(month)+ "' AND " +KEY_EXPYEAR+ "='" +String.valueOf(year)+ "'
AND " +KEY_EXPFROM+ "='" +String.valueOf(from)+"'";
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = db.rawQuery(selectquery, new String[]{cat, month,year,from});
logcat:
03-20 15:01:36.606 19106-19125/com.expense.javed.expensetrackingsystem D/OpenGLRenderer﹕ Render dirty regions requested: true 03-20 15:01:36.623 19106-19106/com.expense.javed.expensetrackingsystem D/Atlas﹕ Validating map... 03-20 15:01:36.680 19106-19125/com.expense.javed.expensetrackingsystem I/Adreno-EGL﹕ : EGL 1.4 QUALCOMM build: AU_LINUX_ANDROID_LA.BF.1.1.04.04.02.162.107_msm8226_LA.BF.1.1__release_AU () OpenGL ES Shader Compiler Version: E031.25.01.03 Build Date: 10/28/14 Tue Local Branch: Remote Branch: quic/l_LNX.LA.3.6 Local Patches: NONE Reconstruct Branch: AU_LINUX_ANDROID_LA.BF.1.1.04.04.02.162.107 + cb93e16 + f50fe49 + d7c18e6 + 5b9a565 + 0f3a25d + 607156e + 75511aa + e4d16c0 + 686f3eb + 211a271 + dd281ee + NOTHING 03-20 15:01:36.683 19106-19125/com.expense.javed.expensetrackingsystem I/OpenGLRenderer﹕ Initialized EGL, version 1.4 03-20 15:01:36.762 19106-19125/com.expense.javed.expensetrackingsystem D/OpenGLRenderer﹕ Enabling debug mode 0 03-20 15:01:48.482 19106-19106/com.expense.javed.expensetrackingsystem I/Choreographer﹕ Skipped 30 frames! The application may be doing too much work on its main thread. 03-20 15:01:48.494 19106-19125/com.expense.javed.expensetrackingsystem V/RenderScript﹕ Application requested CPU execution 03-20 15:01:48.507 19106-19125/com.expense.javed.expensetrackingsystem V/RenderScript﹕ 0xb862fc90 Launching thread(s), CPUs 4 03-20 15:02:13.932 19106-19106/com.expense.javed.expensetrackingsystem E/SQLiteLog﹕ (1) near "SELECTexpenseamountFROMexpenseWHEREexpensecategory": syntax error 03-20 15:02:13.946 19106-19106/com.expense.javed.expensetrackingsystem D/AndroidRuntime﹕ Shutting down VM 03-20 15:02:13.962 19106-19106/com.expense.javed.expensetrackingsystem E/AndroidRuntime﹕ FATAL EXCEPTION: main Process: com.expense.javed.expensetrackingsystem, PID: 19106 android.database.sqlite.SQLiteException: near "SELECTexpenseamountFROMexpenseWHEREexpensecategory": syntax error (code 1): , while compiling: SELECTexpenseamountFROMexpenseWHEREexpensecategory='food'AND expensemonth='march' AND expenseyear='2015' AND expensefrom='InBank' at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method) at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:889) at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:500) at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588) at android.database.sqlite.SQLiteProgram.(SQLiteProgram.java:58) at android.database.sqlite.SQLiteQuery.(SQLiteQuery.java:37) at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:44) at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1316) at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1255) at com.expense.javed.expensetrackingsystem.SqlLiteDb.updateExpense(SqlLiteDb.java:122) at com.expense.javed.expensetrackingsystem.ExpensingAmountActivity.onClick(ExpensingAmountActivity.java:145) at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:160) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5312) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696) 03-20 15:02:15.674 19106-19106/com.expense.javed.expensetrackingsystem I/Process﹕ Sending signal. PID: 19106 SIG: 9 03-20 15:02:16.502 20366-20387/com.expense.javed.expensetrackingsystem D/OpenGLRenderer﹕ Render dirty regions requested: true 03-20 15:02:16.518 20366-20366/com.expense.javed.expensetrackingsystem D/Atlas﹕ Validating map... 03-20 15:02:16.576 20366-20387/com.expense.javed.expensetrackingsystem I/Adreno-EGL﹕ : EGL 1.4 QUALCOMM build: AU_LINUX_ANDROID_LA.BF.1.1.04.04.02.162.107_msm8226_LA.BF.1.1__release_AU () OpenGL ES Shader Compiler Version: E031.25.01.03 Build Date: 10/28/14 Tue Local Branch: Remote Branch: quic/l_LNX.LA.3.6 Local Patches: NONE Reconstruct Branch: AU_LINUX_ANDROID_LA.BF.1.1.04.04.02.162.107 + cb93e16 + f50fe49 + d7c18e6 + 5b9a565 + 0f3a25d + 607156e + 75511aa + e4d16c0 + 686f3eb + 211a271 + dd281ee + NOTHING 03-20 15:02:16.578 20366-20387/com.expense.javed.expensetrackingsystem I/OpenGLRenderer﹕ Initialized EGL, version 1.4 03-20 15:02:16.609 20366-20387/com.expense.javed.expensetrackingsystem D/OpenGLRenderer﹕ Enabling debug mode 0
不要那样做。您的代码容易受到 SQL 注入攻击。你真的应该使用准备好的语句吗?值的占位符,然后稍后设置值。或者,至少,您应该正确地转义字符串。要了解 SQL 注入,请参阅 http://en.wikipedia.org/wiki/SQL_injection
然而,至于你的错误,我认为这说明了一切:
"SELECTexpenseamountFROMexpenseWHEREexpensecategory='food'AND expensemonth='march' AND expenseyear='2015' AND expensefrom='InBank'"
您的查询中缺少空格。