如何从 android studio 中的 SQLite 插入中删除不需要的字符
Posted
技术标签:
【中文标题】如何从 android studio 中的 SQLite 插入中删除不需要的字符【英文标题】:How to remove unwanted characters from SQLite insert in android studio 【发布时间】:2020-04-08 19:32:37 【问题描述】:当我通过 JSON 从我的服务器传递数据时。我遇到了这个错误。
android.database.sqlite.SQLiteException: near "rusitha": syntax error (code 1): , while compiling: INSERT INTO customer (id, name,nic,areaId,tp,address) VALUES ('583', 's.p.m.j.ilangasinghe.', '805250666v','18','0716090398','no.79,'rusitha',nuwarapara,maradankadawala.');
这是我使用的代码。
for(i = 0;i<customerId.length();i++)
sqlite.execSQL("INSERT INTO customer (id, name,nic,areaId,tp,address) VALUES ('"+customerId.get(i).toString()+"', '"+customerName.get(i).toString()+"', '"+customerNIC.get(i).toString()+"','"+customerAreaId.get(i).toString()+"','"+customerTp.get(i).toString()+"','"+customerAddress.get(i).toString()+"');");
【问题讨论】:
【参考方案1】:问题在于'no.79,
没有结束单引号。这是因为rushita 用单引号括起来并且前面有逗号。简而言之,地址没有被正确转义,所以 rushita 周围的单引号会混淆 SQLite。
您的选择是将地址中的单引号替换为 2 个单引号,例如
customerAddress.get(i).toString().replace("'","''")
或者通过使用扩展签名execSQL 方法使用绑定来代表您完成此操作。例如
sqlite.execSQL("INSERT INTO customer (id, name,nic,areaId,tp,address) VALUES (?,?,?,?,?,?)"), newString[]customerId.get(i).toString(),customerName.get(i).toString(),customerNIC.get(i).toString(),customerAreaId.get(i).toString(),customerTp.get(i).toString(),customerAddress.get(i).toString());
与以前的方法相比,建议使用绑定。
另一种方法是使用insert 便利方法,例如
ContentValues cv = new ContentValues();
cv.put("id",customerId.get(i).toString());
cv.put("name",customerName.get(i).toString());
cv.put("nic",customerNIC.get(i).toString());
cv.put("areaId",customerAreaId.get(i).toString());
cv.put("tp",customerTp.get(i).toString());
cv.put("address",customerAddress.get(i).toString());
long insertedId = sqlite.insert("customer",null,cv);
这将是最推荐的方式。
它代表您构建 SQL, 绑定值, 返回插入行的rowid 在绑定值时,它与扩展的 execSQL 一样,可以防止 SQL 注入。注意以上代码为in-principal code,未经检查、测试或运行,可能存在一些小错误。
【讨论】:
【参考方案2】:您可以在使用之前为您获得的 JSON 数据正确转义字符:
// JSON Escape Utility
public static String crunchifyJSONEscapeUtil(String crunchifyJSON)
final StringBuilder crunchifyNewJSON = new StringBuilder();
// StringCharacterIterator class iterates over the entire String
StringCharacterIterator iterator = new StringCharacterIterator(crunchifyJSON);
char myChar = iterator.current();
// DONE = \\uffff (not a character)
while (myChar != StringCharacterIterator.DONE)
if (myChar == '\"')
crunchifyNewJSON.append("\\\"");
else if (myChar == '\t')
crunchifyNewJSON.append("\\t");
else if (myChar == '\f')
crunchifyNewJSON.append("\\f");
else if (myChar == '\n')
crunchifyNewJSON.append("\\n");
else if (myChar == '\r')
crunchifyNewJSON.append("\\r");
else if (myChar == '\\')
crunchifyNewJSON.append("\\\\");
else if (myChar == '/')
crunchifyNewJSON.append("\\/");
else if (myChar == '\b')
crunchifyNewJSON.append("\\b");
else
// nothing matched - just as text as it is.
crunchifyNewJSON.append(myChar);
myChar = iterator.next();
return crunchifyNewJSON.toString();
code originally from this site
【讨论】:
以上是关于如何从 android studio 中的 SQLite 插入中删除不需要的字符的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 SQL-lite 数据库检索到 android studio 中的单选按钮组
如何从Mac从android studio中的fabric注销? [复制]
如何从 android studio 中的 SQLite 插入中删除不需要的字符
如何修复错误:从android studio运行时flutter中的processDebugMainManifest DEBUG