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
相关产品推荐
相关产品推荐

