【问题标题】:How to remove unwanted characters from SQLite insert in android studio如何从 android studio 中的 SQLite 插入中删除不需要的字符
【发布时间】: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()+"');");
}

【问题讨论】:

    标签: android json sqlite android-sqlite


    【解决方案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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-02-01
        • 2011-08-13
        • 2011-12-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多