如何从 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中的另一个模块导入类?

如何修复错误:从android studio运行时flutter中的processDebugMainManifest DEBUG

如何从android studio中的任何地方访问localhost数据库