edittext中的单引号(')使我的程序崩溃

时间:2012-06-24 17:06:02

标签: android android-edittext quote

如果我在edittext中写入包含单引号(')的内容,我的程序会崩溃。使用这个edittext我可以搜索我的数据库中的一些东西,其中一些包含这个单个qoute(或撇号它有什么名称,但关键是它是关于单个qoute)。我认为它有一些特殊的功能,这就是它崩溃的原因。有没有选择忽略它的功能或以某种方式解决这个问题?

例如,我的数据库中的项目:

cv.put(KEY_NAME, "Jonh's idea");
cv.put(KEY_HOTNESS, "amazing");
cv.put(KEY_MONEY, "500");
ourDatabase.insert(DATABASE_TABLE, null, cv);

然后当我用这种方法搜索它时:

return ourDatabase.query(DATABASE_TABLE, new String[] {"_id", "idea_name",},  
"idea_name like " + "'%" + qq + "%'", null, null, null, null);

其中qq由用户给出(例如Jonh的想法),它很糟糕。是的,我得到语法错误。

4 个答案:

答案 0 :(得分:2)

听起来'导致SQL注入某种类型...... '导致SQL语句出现语法错误。有几件事你可以考虑仔细检查:

  1. rawQuery()不会保护您免受SQL注入,因此请避免使用它(而是使用queryinsertupdate和{{1而不是方法)。

  2. 首选格式化deleteselection,如下所示(因为它可以保护您免受SQL注入):

    selectionArgs

    (请注意selection = "col_1 = ?"; selectionArgs = new String[] { "value_1" }; 中的值会替换String[]字符串中的?

  3. selection上设置inputType,以防止用户首先输入这些字符(例如,如果您只希望用户输入数字,则设置EditText

  4. 总的来说,只要您正确使用android:inputType="number"类中的Android方法,就不应该遇到SQL注入的任何问题(Android在清除它方面做得很好您)。也就是说,如果您不选择使用这些特殊用途的方法,那么您应该在运行时检查String的内容并防止SQLiteDatabase',{{ 1}}等,通过逃避它们。

  5. 您可以参考这篇文章了解更多信息:

    Android Single Quote In SQL With a LIKE StateMent

答案 1 :(得分:1)

您需要使用selectionArgs参数来转义字符串(以便其中的单引号不会破坏SQL)。尝试这样的事情:

return ourDatabase.query(DATABASE_TABLE, new String[] {"_id", "idea_name",}, "idea_name like ?", new String[] { "%" + qq + "%" }, null, null, null);

答案 2 :(得分:0)

好像是SQL-injection。你不得不逃避你的意见。

答案 3 :(得分:0)

还有一个jugaad。你可以用'替换'。您不必重新检查您的代码。只需修改以下内容:

String input = edittext.getText().toString();

if(input.contains("'"))
{
   input = input.replace("'", "`");
}
//now proceed with the database operation ...

这将使用户能够将 RD的jugaad 等文字输入 RD`sugaad