android - 将 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()
+"' );"
);
如何解决这个问题呢?
解决方案
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 更适合您的用例。
推荐阅读
- c# - 基于列将两个数据表合并为一个
- redirect - 使用 https 形式将 aaa.com 重定向到 bbb.com 的 DNS
- xml - 如果在 XSD 中定义,则验证,否则 - 允许,但不验证
- amazon-web-services - AWS API Gateway 仅在使用 SAM 时支持 CORS for OPTIONS(没有 Lambda 代理集成)
- ios - 多个选定的行以在其他视图控制器中显示多个图像
- rest - RESTful 设计 - 子资源端点
- javascript - 在流星中检查时复选框不显示元素
- r - 在 igraph 中识别和量化集群类型
- r - ggplot2用日期注释构面错误
- sql-server - 如何将 geoJSON 坐标输入到 SQL Server 数据库?