You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android通过ContentProvider查询SQLite时间戳列返回0行如何解决?

问题根因

问题确实出在selectionArgs的使用上。Android SQLite的query方法中,selectionArgs传入的所有内容都会被作为字符串字面量处理,不会解析执行其中的SQL函数。你将datetime('now')、datetime('now','start of day')放到selectionArgs中时,实际执行的SQL等价于:

SELECT * FROM TransactionTable WHERE transaction_date < 'datetime('now')' AND transaction_date >= 'datetime('now','start of day')'

相当于用时间字段和普通字符串做比较,自然匹配不到任何数据。

解决方案

直接将SQLite函数写在selection条件中,不要放到参数里即可,修改代码如下:

String selection =  myContractClass.myTransactionEntry.COLUMN_TRANSACTION_DATE + " < datetime('now')" + " AND "
                + myContractClass.myTransactionEntry.COLUMN_TRANSACTION_DATE + " >= datetime('now','start of day')";
// 无需传入对应的参数,selectionArgs设为null
String[] selectionArgs = null;
try
{
    new FetchTransaction(selection,selectionArgs,"10").execute(myContractClass.myTransactionEntry.CONTENT_URI);
}catch (Exception e) {
    e.printStackTrace();
}

如果后续需要适配自定义时间范围的查询,也可以先在Java层计算好对应时间的格式字符串,再放到selectionArgs中传入,避免直接在参数里写SQL函数。

内容的提问来源于stack exchange,提问作者Vivek gupta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 18:54:04