SQLiteDatabase android中的特殊字符

Abh*_*ora 0 java sql sqlite android special-characters

我即将完成我的第一个Android应用程序.但我很想知道在SQLite数据库中保存特殊字符的一些事情.

当我从编辑视图中获取数据并将数据放入我的数据库时,我能够输入所有特殊字符而无需处理任何内容.例如.

EditText editText1 = (EditText) findViewById(R.id.user_name);
String name = editText1.getText().toString();
db.execSQL("INSERT INTO DETAILS VALUES('" + name + "');");
Run Code Online (Sandbox Code Playgroud)

现在的问题

即使我输入),(,",*或任何其他特殊字符,它能够在我输入'(撇号)后插入该数据 但是有错误(日志显示语法).我几乎读过每个问题与stackoverflow上的特殊字符相关,但我仍然无法理解即使使用(或)或"应该生成语法错误,与撇号的情况相同.那么为什么会发生.即使它适用于我,但是我很好奇.还有什么是逃避这些特殊角色的最好方法?

提前致谢

mat*_*ash 6

不要execSQL()用于此!

SQLiteDatabase.insert() 将为您构建语句,并避免参数中的特殊字符出现任何问题.

ContentValues values = new ContentValues();
values.put("FIELD_NAME", name);
db.insert("DETAILS", null, values);
Run Code Online (Sandbox Code Playgroud)

要了解发生了什么,只需通过添加参数来检查生成的SQL语句是什么:

  • name = Scarlett - > INSERT INTO DETAILS VALUES('Scarlett');(好的)
  • name = O'Hara - > INSERT INTO DETAILS VALUES('O'Hara');(错)

由于撇号是SQL中的字符串分隔符,因此有一个'O'字符串加上Hara'不是有效的标记.在这种情况下,它只会产生错误,但恶意制作的字符串可能会产生有效的SQL,这会产生意想不到的事情.

这就是为什么在编写SQL语句时连接字符串是一个非常糟糕的做法(TM),因为它可能导致SQL注入.记住Bobby Tables的故事!

在此输入图像描述