当我使用我的函数从“mysql.db”检索数据时,我收到了SQL异常(无法识别的标记)。当String 地址在其中有引号时会发生异常。
我已经尝试更改此行
KEY_ADDRESS + "='" + address + "'",
到
KEY_ADDRESS + "=\"" + address + "\"",
它解决了包含单引号(')和(`)的字符串的问题,但是为包含双引号(“)的字符串创建了另一个问题。
我尝试使用
DatabaseUtils.sqlEscapeString(address);
没有效果。
我尝试使用此问题中的 escape 函数:How do I escape special characters in MySQL?,但它不起作用。
这是我的代码:
public Cursor getNameFromAddress(String address) throws SQLException
{
Cursor mCursor =
db.query(DATABASE_TABLE_PRINC, new String[] {
KEY_ROWID,
KEY_NAME,
KEY_ADDRESS
},
KEY_ADDRESS + "='" + address + "'",
null,
null,
null,
null,
null);
if (mCursor != null) {
mCursor.moveToFirst();
}
return mCursor;
}
答案 0 :(得分:5)
那些selectionArgs
/ whereArgs
旨在用于此目的:
Cursor mCursor =
db.query(DATABASE_TABLE_PRINC, new String[] {
KEY_ROWID,
KEY_NAME,
KEY_ADDRESS
},
KEY_ADDRESS + "=?",
new String[] { address },
null,
null,
null,
null);
将所有"='" + stuff + "'"
替换为"=?"
并将数据按照?
String[]
然后 ?
将自动替换为转义字符串数据。
答案 1 :(得分:2)
缺少“?”符号
Cursor mCursor =
db.query(DATABASE_TABLE_PRINC, new String[] {
KEY_ROWID,
KEY_NAME,
KEY_ADDRESS
},
KEY_ADDRESS + "=?" ,
new String[]{address},
null,
null,
null,
null);
答案 2 :(得分:2)
queryText = "select * from yourtable where address = ?";
mDb.rawQuery(queryText, new String[] {addressValue});
通过这种方式,您可以解决问题并保护系统免受SQL注入攻击。