【问题标题】:Android Sqlite selection args[] with int values具有 int 值的 Android Sqlite 选择 args[]
【发布时间】:2013-09-11 16:07:31
【问题描述】:

在我的 DBHelper 的 getEvents 方法中有这行代码。

    int year, month, day;
    String[] columns = new String[] { KEY_EVENTNAME, KEY_DESCRIPTION,
            KEY_HOUR, KEY_MINUTE, KEY_DAY, KEY_MONTH, KEY_YEAR,
            KEY_REMINDER };
    Cursor c = database.query(DATABASE_TABLE, columns, 
            KEY_YEAR + "=?"+ " AND " + KEY_MONTH + "=?" + " AND "+ KEY_DAY + "=?",
            new String[] {String.valueOf(year), String.valueOf(month), String.valueOf(day)}, 
            null, null, KEY_MONTH + " AND "
            + KEY_DAY);

它总是什么也不返回。当我删除以下内容时

    int year, month, day;
    String[] columns = new String[] { KEY_EVENTNAME, KEY_DESCRIPTION,
            KEY_HOUR, KEY_MINUTE, KEY_DAY, KEY_MONTH, KEY_YEAR,
            KEY_REMINDER };
    Cursor c = database.query(DATABASE_TABLE, columns, 
            KEY_YEAR + "=?",
            new String[] {String.valueOf(year)}, 
            null, null, KEY_MONTH + " AND "
            + KEY_DAY);

它运行正常。我的代码有什么问题?似乎它不接受多个值作为 where 子句。 谁能帮我这个?谢谢。

【问题讨论】:

  • 您是否收到错误或空结果集?你检查了月份和日期的值吗?
  • 我做到了。年、月、日值正确。这就是为什么我不明白为什么这什么都不返回。
  • 所以没有错误?因为查询看起来真的很好。请从您的第二个查询中放一个示例结果,也许参数有问题。
  • 我没有收到任何错误,它只是返回 0 或什么都不返回。

标签: android sqlite


【解决方案1】:

答案就在标题中:您试图将整数值传递到查询中,但实际上最终得到的是 string 值。

这是 Android 数据库 API 中的一个可怕的设计错误;您只能对字符串使用参数。

整数没有字符串值的格式和SQL注入问题,所以你可以直接将数字插入到SQL表达式中:

Cursor c = database.query(
    DATABASE_TABLE, columns, 
    KEY_YEAR  + "=" + year  + " AND " +
    KEY_MONTH + "=" + month + " AND " +
    KEY_DAY   + "=" + day,
    null, null, null,
    KEY_MONTH + "," + KEY_DAY);

(而且orderBy 语法错误。)

【讨论】:

  • 从来没有遇到过这种情况,我从2.2开始就一直在使用这个api!话虽如此,我从未尝试过单独存储日期的 Y/M/D 值..
  • 所有 API 都会出现这种情况吗? sqlite 是否变得更聪明并开始处理int = '4'?我刚刚发现在较新设备上运行的查询不适用于 android kitkat 设备
  • 这与SQLite本身无关; Android 框架在这里使用了一个字符串数组。 (execSQL() 除外,它不能返回结果行。)
【解决方案2】:

我看不出语法或逻辑有什么问题。尝试检查年、月、日的值是否正确。

【讨论】:

  • 我做到了。年、月和日的值是正确的。这就是为什么我不明白为什么这什么都不返回。
【解决方案3】:

感谢您的所有帮助。在考虑了你建议的一切之后,我终于找到了为什么它总是什么都不返回的原因。我传递给此方法的月份值不正确。提前一个月,这就是为什么当月返回 0 的原因。我很抱歉给您带来麻烦。但你所有的答案都是正确的。这是我相信大多数人或一些人都经历过的错误。作为一项学习,我会格外小心地研究我通过的价值观。仔细查看在方法之间传递的值流可以节省时间。我整晚都在寻找问题,就在今天早上醒来后,我想起了传递给方法的值。再次感谢所有给出答案的人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-11
    • 2021-03-25
    • 2017-12-17
    • 1970-01-01
    • 2012-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多