1

所以当我学习 Android 时,我得到了很多关于如何使用ContentProvider以及如何正确插入东西的建议SqliteDatabase。现在我有一个没有意义的错误,至少每个人都告诉我的一切都是这样。错误是这样的:

android.database.sqlite.SQLiteException: near "s": syntax error:
while compiling: SELECT * FROM events WHERE time_stamp='07/21/2012 2:59:03 PM' AND
event='Test This's'

只要'没有出现在任何地方,一切正常。我知道为什么,因为它需要逃脱。但这没有意义,因为每个人都告诉我不要使用原始查询,而是使用提供的绑定方法,如果这甚至有意义的话。让我提供我的示例:

ContentValues newValues = new ContentValues();
newValues.put("event_id", eventId);
newValues.put("event_name", eventName);
newValues.put("start_date", startDate);
newValues.put("start_time", values.getAsString("start_time"));
newValues.put("end_date", endDate);
newValues.put("end_time", values.getAsString("end_time"));
newValues.put("location", values.getAsString("location"));
Long success = database.insert("events_info", null, newValues);

据我所知,既然它假设绑定它,为什么我需要逃避它!?除非这仅适用于其他方法,如query()update()。在任何一种情况下,我都希望有人能阐明在 Android 中为 SQLite 插入准备字符串的正确做法。先感谢您。

4

1 回答 1

2

SELECT * FROM events WHERE time_stamp='07/21/2012 2:59:03 PM' AND event='Test This's

我想你知道,日期字符串'07/21/2012 2:59:03 PM'是正确分隔的,而事件字符串'Test This's'不是。

简单的修复它将字符串更改为'Test This''s'

一般问题,“你如何更正和验证输入”,实际上是一个非常大的问题 - 涉及的问题不仅仅是“引号”分隔符。

可以说,您最好的防线是使用“查询参数”:

EXAMPLE:
p_query = "select * from mytable where name_field = ?";
mDb.rawQuery(p_query, new String[] { uvalue });

我很难找到关于该主题的好教程 - 抱歉。这是我能做的最好的:

这是一篇关于相关主题“SQL 注入”的好文章:

最后,如果你真的想“转义”你的输入字符串,你可能会比使用简单的 Java String.replaceAll () 做得更糟:

于 2012-07-21T19:18:10.063 回答