android中的SQlite WHERE子句不起作用

时间:2017-03-13 07:18:50

标签: android sqlite android-sqlite

在我的项目中,我使用SQLiteDatabase.query函数从DB获取数据。查询是:

 Cursor c = db.query("event as ev left join logo as l ON ev.logo_id = l.logo_id",
            new String[] {"ev.event_id", "ev.name", "ev.event_date", "ev.type", "l.path"},
            "strftime('%m', 'now') <= ? OR (strftime('%d', 'now') <= ? " +
                    "AND strftime('%m', 'now') == ?)",
            new String[] {"strftime('%m', ev.event_date)", "strftime('%d', ev.event_date)",
                    "strftime('%m', ev.event_date)"}, null, null,
            "strftime('%m', ev.event_date), strftime('%d', ev.event_date) ASC", limit);

事件表的内容:

1|День Рождения|1964-09-10 00:00:00|birthday|1
2|День Рождения|1964-06-10 00:00:00|birthday|2
3|День Рождения|1985-01-01 00:00:00|birthday|3
4|День Рождения|1992-05-11 00:00:00|birthday|4

徽标表的内容:

1|/data/data/com.example.app/app_imageDir/imageavatar_14e18a68-7049-433f-9954-fb3fea6000e1.png
2|/data/data/com.example.app/app_imageDir/imageavatar_5dda2aec-   136e-468d-af04-ca6e74804765.png
3|/data/data/com.example.app/app_imageDir/imageavatar_d1626db3-3f7c-474d-8294-c498f40c6892.png
4|/data/data/com.example.app/app_imageDir/imageavatar_d2f995a1-ae3c-41fd-8bdd-c69b1566239a.png

从查询中可以看出,游标必须只包含event_id 1,2,4(3月13日测试)的事件。 但是当我启动应用程序时,所有事件都会出现在屏幕上。 如果我重写这个查询并从sqlite的控制台运行它,一切正常。

从光标获取数据的代码是:

public List<Map<String, String>> getAll(Cursor c) {
    List<Map<String, String>> data = new ArrayList<>();
    int counter = 0;

    if (c.moveToFirst()) {
        do {
            Map<String, String> map = new HashMap<String, String>();
            for (String cn : c.getColumnNames()) {
                 map.put(cn, c.getString(c.getColumnIndex(cn)));
            }
            data.add(counter, map);
            counter++;
        } while (c.moveToNext());
    }

    return data;
}

有什么问题?

1 个答案:

答案 0 :(得分:3)

您只能对文字值(如字符串文字)使用?变量和参数绑定。您不能将它用于绑定表达式,例如strftime('%m', ev.event_date) - 它将被绑定为字符串文字。

将表达式移动到SQL查询本身的一部分。