具有 int 值的 Android Sqlite 选择 args[]

标签 android sqlite

在我的 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 子句。 谁能帮我这个?谢谢。

最佳答案

答案在标题中:您正试图将整数值传递到查询中,但您最终得到的是字符串值。

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

整数不存在字符串值可能存在的格式化和 SQL 注入(inject)问题,因此您可以直接将数字插入到 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 语法错误。)

关于具有 int 值的 Android Sqlite 选择 args[],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18746149/

相关文章:

android - 如何在 Xamarin Forms 应用程序 (android) 中仅激活 1 个 ListView 项目并禁用其他项目

java - 安卓 : Unable to Access Function From Other Class (Service)

java - 拆分具有多个字母和字母的字符串 - android

java - 致命异常 : AsyncTask #1 cropping image

android - 如何让我的安卓应用程序在苹果设备上运行

android studio sqlite 异常

c# - 在 C# 中使用 SQLite 的 Pragma-s

android - 如果网络可用,如何导航到另一个 Activity ?

mysql - 如何找到表中具有满足特定条件的列的最大条目数?

iphone - iOS 检查数据库是否已创建并在两个 .sqlite 文件之间进行选择以加载