轉載請注明出處,謝謝~http://www.cnblogs.com/iOcean/archive/2012/03/02/2377648.html
1.問題描述
SQLiteDatabase mDB = this.getWritableDatabase(); String insertStr = "insert into mTable(id,name,age,phone) values(1,'iOcean's','80','110')"; mDB.execSQL(insertStr);
注:數據可能是server拿來的數據,為說明問題此處臨時寫死的。
當執行該代碼時后台就會報異常如下:
insert Exception:android.database.sqlite.SQLiteException: near "s": syntax error: insert into mTable(id,name,age,phone) values(1,'iOcean's','80','110')
很明顯,是因為單引號引起的。
2.解決方法:
先是考慮的可不可以手動轉義后insert,但是簡單的使用String的replace方法不行,仍會報錯
str.replace("'", "\\\\'");就算這種方法可行,但是引起問題的還有可能是其他字符,所以這種思路比較麻煩。那就換換嘍^_^
后來查資料發現,SQLiteDatabase類的execSQL方法有兩個,上面是其一execSQL (String sql),而另一個為execSQL (String sql, Object[] bindArgs)
而該方法支持使用占位符參數(?),所以試試嘍,結果該方法對特殊字符通吃,嘛4么有,呵呵~
所以代碼可以這樣了:
SQLiteDatabase mDB = this.getWritableDatabase(); String insertStr = "insert into mTable(id,name,age,phone) values(?,?,?,?)"; Object[] mValue = new Object[]{1,"iOcean's","80","110"); mDB.execSQL(insertStr, mValue);