【问题标题】:SQLite where clauseSQLite where 子句
【发布时间】:2012-08-09 01:50:17
【问题描述】:

我想根据 LOCID 选择一些行。我怎么不能写 where 子句,它给出了一个编译错误,说不兼容的操作数类型说 String 和 int。

String selectQuery = "SELECT  * FROM " + TABLE_LOCATIONAPPS + " WHERE " 
    + KEY_LOCID == id;

这里是创建查询,

String query1 = "CREATE TABLE " + TABLE_LOCATIONLABLES + "("
            + KEY_LOCID + " INTEGER PRIMARY KEY," + KEY_LOCNAME + " TEXT,"
            +  ")";

LOCID 类型是 int 可能是什么原因?

【问题讨论】:

    标签: java android sqlite compiler-errors where-clause


    【解决方案1】:

    您没有正确构造字符串。您需要将相等比较作为字符串的一部分。

    String selectQuery = "SELECT  * FROM " + TABLE_LOCATIONAPPS + " WHERE " 
        + KEY_LOCID + " = " + id;
    

    这只是说明为什么手动构造 SQL 字符串不是一个好主意的一个例子。除了这些类型的错误之外,您还会遇到 SQL 注入问题。这是当你的输入没有被正确清理并且 SQL 命令最终执行你不想要的东西时。

    【讨论】:

      【解决方案2】:

      我建议不要基于串联字符串执行过滤。这将打开您到SQL Injection Attacks。 (这里有一些examples of how it works。)

      更安全的解决方案是:

      String selectQuery = "SELECT * FROM " + TABLE_LOCATIONAPPS + " WHERE KEY_LOCID = ?"
      PreparedStatement pstmt = connection.prepareStatement(selectQuery);
      pstmt.setInt(1, id);
      ResultSet rs = pstmt.executeQuery();
      

      (这也为通过准备好的语句重用提高性能打开了大门。)

      【讨论】:

        【解决方案3】:

        在我看来,您实际上并没有在查询中进行比较,而是使用 Java 来比较 KEY_LOCID 和 ID。

        试试看:String selectQuery = "SELECT * FROM " + TABLE_LOCATIONAPPS + " WHERE KEY_LOCID == " + id;

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-03-18
          • 1970-01-01
          • 2016-09-18
          • 1970-01-01
          • 2011-09-09
          • 2013-05-28
          相关资源
          最近更新 更多