2

我正在使用 CursorLoader 从我的内容提供者返回记录计数,并且我只需要计算那些 7 天或更少天数的记录。到目前为止,我尝试完成这项工作的尝试只产生了挫败感,因为计数始终为零。我对 Sqlite 和 CursorLoaders 的经验有限,我怀疑我犯了一个非常简单的错误。这是我的代码:

String strCriteria = "SELECT julianday('now') - julianday('" + Session.DATE_STRING
            + "','gregorian') <8";

return new CursorLoader(getSherlockActivity(), Session.CONTENT_URI, 
           new String[] {"count(" + Session.TABLE_NAME + "." + Session._ID +") AS Count " }, 
          strCriteria, null,null);  

谁能看到我哪里出错了?

我应该补充一点,DATE_STRING 列将日期存储为 yyyy-MM-dd 格式的字符串。实际上,我确实有另一列将日期存储为 long,但我还没有弄清楚如何使用数值进行 Sqlite 日期查询。

更新问题:如果我将 strCriteria 定义的 Session.DATE_STRING 部分替换为文本日期,则一切正常。例如,如果我使用以下代码:

String strCriteria = "SELECT julianday('now') - julianday('" + "2013-05-08"
            + "','gregorian') <8";

...而不是我上面的内容,然后一切正常。这使我相信我的代码实际上并未将 Session.DATE_STRING 列的放入字符串中,而是将其他内容放入字符串中,很可能是该列的实际字符串名称。我不知道如何解决这个问题,因为我假设查询实际上会在运行时填写正确的数据值。任何建议将不胜感激!

使用解决方案进行编辑:我已经弄清楚如何使其正常工作。这真的很简单 - 我必须从 Session.DATE_STRING 周围删除 ' 以确保插入列的值,而不是列名。因此,这就是需要定义 strCriteria 的方式:

String strCriteria = "SELECT julianday('now') - julianday(" + Session.DATE_STRING
            + ",'gregorian') <8";
4

1 回答 1

0

我不确定这是否适用于您的意图,但我的应用程序中确实有一个缓存清理器,它可以清除数据库中可能存储超过 x 天前的任何记录。

第一步:保存每条记录时,我将日期保存为毫秒。请记住,我还将日期保存为字符串,因为我也将它用于标签和其他内容。

第二步:创建 Where 语句:

String where = DbOpenHelper.SAVED_ON + " <= " + (System.currentTimeMillis() - msBackInTime);

msBackInTime我要删除的天数在哪里?例如,如果我想返回三天并擦除,那么 msBackInTime 将是:259200000。这样,查询将返回比作为结果提供的日期少的任何项目(因此意味着它们存储在之前)。

快速示例:

现在是:1368020762363,以毫秒为单位。以毫秒为单位的三天是:259200000 三天前是:现在 (1368020762363) 减去三天 (259200000)。

因此,任何SAVED_ON低于差异结果的值都是我将在查询中得到的。

希望有帮助。

于 2013-05-08T13:47:53.177 回答