【问题标题】:SQL syntax error while escaping quotes android转义引号android时出现SQL语法错误
【发布时间】:2019-01-03 17:44:06
【问题描述】:

好的,所以我正在为我的同学构建一个应用程序,该应用程序从我的在线 mysql 数据库中获取程序并将其存储在本地 sqlite 数据库中。

但它给了我一个错误,我也尝试转义双引号和单引号,https://www.eversql.com/sql-syntax-check-validator/ 也验证了我的查询,但我的应用程序仍然崩溃并给我一个错误。

现在代码是“c”语言,因此包含 switch-case 语句,当单引号出现在该 switch-case 语句中时,问题就出现了。

转义引号的代码:

public static void fromJSON(JSONArray jsonArray){

    try {
        String code;
        SplashScreen.titles.clear();
        SplashScreen.codes.clear();
        int length = jsonArray.length();
        for (int i = 0; i < length; i++) {

            SplashScreen.titles.add(jsonArray.getJSONObject(i).getString("title"));
            code = jsonArray.getJSONObject(i).getString("code");
            code = code.replaceAll("\'","\\\\\'");
            code = code.replaceAll("\"","\\\\\"");
            SplashScreen.codes.add(code);

        }
    }catch (Exception e)
    {
        Log.d("Practice", e.toString());
    }

}

SQLite 语句是:

public void updateDatabaseWithUpdate(String tableName)
{
    SQLiteDatabase SPADatabase = this.openOrCreateDatabase("myDatabase", MODE_PRIVATE, null);

    Log.d("getUpdateData", "Updating database : "+tableName);

    //SPADatabase.execSQL("DELETE FROM "+tableName);

    for(int i = 0; i<titles.size(); i++) {
        Log.d("trialanderror", codes.get(i));
        SPADatabase.execSQL("INSERT INTO " + tableName + " (title,code) VALUES ('" + titles.get(i) + "','" + codes.get(i) + "')");
    }

    //Toast.makeText(this, tableName+" Database updated!", Toast.LENGTH_SHORT).show();

    setLocalCounts();

    //Log.d("dbCount", tableName+" dbCount = "+dbCount);


}

我得到的错误:

07-26 21:58:08.448 8919-8919/com.femindharamshi.spa E/SQLiteLog: (1) "c" 附近: 语法错误 07-26 21:58:08.449 8919-8919/com.femindharamshi.spa D/AndroidRuntime: 关闭虚拟机 07-26 21:58:08.450 8919-8919/com.femindharamshi.spa E/AndroidRuntime: 致命例外: main 进程:com.femindharamshi.spa,PID:8919 android.database.sqlite.SQLiteException:接近“c”:语法错误(代码1):,编译时:INSERT INTO controlstructures(标题,代码)VALUES('WAP在基于菜单的程序上执行数学运算符','#include #include #include 无效的主要() { 双x; 魅力; clrscr(); printf(\"输入 X 的值:\"); scanf(\"%lf\", &x); printf(\"请输入您的选择:\n\"); printf(\"c or C for ceil\nf or F for floor\ne or E for exp\ns or S for sqrt \nl or L fir log\na or A for fabs : \n\"); scanf(\"%s\", &M); 开关(M) { 案例\'c\': 案例\'C\':printf(\"Ceil = %lf\", ceil(x)); 休息; 案例\'f\': case \'F\':printf(\"Floor = %f\", floor(x)); 休息; 案例\'e\': 案例\'E\':printf(\"Exp = %lf\", exp(x)); 休息; 案例\'s\': 案例\'S\':printf(\"Sqrt = %lf\", sqrt(x)); 休息; 案例\'l\': 案例\'L\':printf(\"Log = %lf\", log(x)); 休息; 案例\'a\': 案例\'A\':printf(\"fabs(x) = \", fabs(x)); 休息; 默认值:printf(\"无效输入\"); } getch(); }') 在 android.database.sqlite.SQLiteConnection.nativePrepareStatement(本机方法) 在 android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:889) 在 android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:500) 在 android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588) 在 android.database.sqlite.SQLiteProgram.(SQLiteProgram.java:58) 在 android.database.sqlite.SQLiteStatement.(SQLiteStatement.java:31) 在 android.database.sqlite.SQLiteDatabase.executeSql(SQLiteDatabase.java:1677) 在 android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1608) 在 com.femindharamshi.spa.SplashScreen.updateDatabaseWithUpdate(SplashScreen.java:495) 在 com.femindharamshi.spa.SplashScreen$5.onSuccess(SplashScreen.java:473) 在 com.loopj.android.http.JsonHttpResponseHandler$1$1.run(JsonHttpResponseHandler.java:154) 在 android.os.Handler.handleCallback(Handler.java:789) 在 android.os.Handler.dispatchMessage(Handler.java:98) 在 android.os.Looper.loop(Looper.java:164) 在 android.app.ActivityThread.main(ActivityThread.java:6541) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)

【问题讨论】:

    标签: android sqlite escaping


    【解决方案1】:

    SQL 不是 C,并且不使用 C 转义规则。

    在SQL字符串中,双引号不能转义,单引号必须加倍''

    但是,为避免此类格式问题,最好使用参数(其中的值根本不需要转义):

    SPADatabase.execSQL("INSERT INTO " + tableName + " (title,code) VALUES (?,?)",
                        new Object[]{ titles.get(i), codes.get(i) });
    

    或使用helper function like insert() 完全避免编写 SQL 命令。

    【讨论】:

      猜你喜欢
      • 2015-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-17
      • 2018-06-23
      • 2013-10-07
      • 2020-11-05
      相关资源
      最近更新 更多