首页 > 解决方案 > 将 webview geturl 和 gettitle 保存在 Sqlite 数据库中。语法错误撇号的问题'

问题描述

当我保存 webview.getTitle (); 在 Sqlite 数据库中,如果标题中有撇号('),那么我得到错误 -

android.database.sqlite.SQLiteException:在“at”附近:语法错误(代码1):,编译时:INSERT INTO Favorite VALUES('4 madhab bid'at tavassul','file:///android_asset/web/akaid/ 4maddhab/4.htm');

我的代码是这样的

mysql objcon = new mysql(this, null, null, 1);
SQLiteDatabase db = objcon.getReadableDatabase();
db.execSQL(
    "INSERT INTO Favorite VALUES('"
     + txtnombre.getText()
     + "', '"
     + txtlink2.getText()
     +"' );"
);

如何解决这个问题呢?

标签: androidsqldatabasesqlitesql-insert

解决方案


txtnombre.getText():中嵌入了一个单引号'4 madhab bid'at tavassul'。这会导致 SQLite 错误地认为该引号标记了要插入的第一个值的结尾。

为避免这种情况,您可以考虑手动将单引号加倍:

db.execSQL(
    "INSERT INTO Favorite VALUES('"
    + txtnombre.getText().replaceAll("'","\''")
    + "', '"
    + txtlink2.getText().replaceAll("'","\''")
    +"' );"
);

我建议使用绑定参数。使用此选项,您的数据库驱动程序会在后台处理转义:

q = "INSERT INTO Favorite VALUES(?, ?)";
t1 = txtnombre.getText();
t2 = txtlink2.getText();
db.rawQuery(q, new String[] { t1, t2 });

最后,Android 中的另一种方法是使用原生方法sqlEscapeString(),它主要是为此目的而构建的。

此外,正如 pskink 所评论的,使用insert()比原始 SQL 更适合您的用例。


推荐阅读