在我的项目中,我使用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;
}
有什么问题?
答案 0 :(得分:3)
您只能对文字值(如字符串文字)使用?
变量和参数绑定。您不能将它用于绑定表达式,例如strftime('%m', ev.event_date)
- 它将被绑定为字符串文字。
将表达式移动到SQL查询本身的一部分。