【问题标题】:Using java String.format on a android sqlite arguments在 android sqlite 参数上使用 java String.format
【发布时间】:2012-06-01 20:04:29
【问题描述】:

Android sqlite 命令就像 db.delete(table, whereClause, whereArgs); whereClause 是一个字符串,例如“column1 = ? and column2 = ?” whereArgs 是一个字符串数组,它保存将在 whereClause 中替换的值。 有没有一种简单的方法可以让我从中获取解码的字符串(用于记录目的)。 String.format 似乎很接近,但并不完全。这就是我的目标:

 Log.e(MY_DEBUG_TAG, 
     "Error executing Delete(" + table + ", " + 
            String.format(whereClause, whereArgs + ")");

【问题讨论】:

  • 为什么要让自己容易受到 SQL 注入攻击(或计算出所有需要的引用)而不是以正常方式使用参数化查询?
  • 我正在使用参数化查询。只是当我遇到问题时,我想阅读日志,看看我试图做什么。 string[].ToString() 没有给出关于数组中字符串的任何有用信息,所以我想知道如何将参数变成易于阅读的字符串。
  • 我很抱歉 - 我错过了这只是为了记录的事实。我个人只会记录参数化的 SQL 并单独记录参数。
  • 我要问的是,当出现错误时,堆栈跟踪会显示已编译的查询。它看起来像一个常规的 SQL 查询,以一种很好的人类可读形式。我想用相同的格式记录查询。但是将 where 子句和 whereargs 转换为友好的字符串似乎很乏味。我希望有一个简单的方法。想到String.format,但不太对。

标签: android sqlite string.format


【解决方案1】:

如果仅用于记录目的,您可以尝试:

 Log.e(MY_DEBUG_TAG, 
     "Error executing Delete(" + table + ", " + 
            String.format(whereClause.replaceAll("\\?", "%s"), (Object[])whereArgs) + ")");

【讨论】:

  • 我收到此警告“应将 String[] 类型的参数显式转换为 Object[],以便从 String 类型调用可变参数方法 format(String, Object...)。它可以或者被强制转换为 Object 以进行 varargs 调用“我该如何让它消失?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-16
  • 1970-01-01
  • 2010-11-14
  • 1970-01-01
  • 2010-11-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多