【问题标题】:How to count the records in a Sqlite table that match a date restriction?如何计算 Sqlite 表中匹配日期限制的记录?
【发布时间】:2013-05-08 13:22:16
【问题描述】:

我正在使用 CursorLoader 从我的 Content Provider 返回记录计数,并且我只需要计算 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 列的 value 放入字符串中,而是将其他内容放入字符串中,很可能是该列的实际字符串名称。我不知道如何解决这个问题,因为我假设查询实际上会在运行时填写正确的数据值。任何建议将不胜感激!

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

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

【问题讨论】:

    标签: android sqlite date android-cursorloader


    【解决方案1】:

    我不确定这是否符合您的预期,但我的应用程序中确实有一个缓存清理器,它可以清除数据库中可能存储在 x 天前的任何记录。

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

    第二步:创建 Where 语句:

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

    msBackInTime 是我要删除的天数(以毫秒为单位)。例如,如果我想回到三天前擦除,那么 msBackInTime 将是:259200000。这样,查询将返回小于(因此意味着它们被存储之前)的任何项目结果提供的日期。

    快速示例:

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

    所以,SAVED_ON 值低于差异结果的任何内容都是我将在查询中得到的。

    希望对您有所帮助。

    【讨论】:

    • Daniel,这种方法有一些优点,但也可能导致结果不完全正确。 5 天 = 432000000 毫秒。如果我在下午 3 点运行查询,它将“错过”7 天前上午 9 点输入的记录,因为这些记录将超过 432000000 毫秒前,尽管从“日期”的角度来看,它们应该被返回。话虽如此,如果我不能正确解决这个问题,我可能不得不求助于这种方法。
    • 我试图找到更合适的方法,但无法通过文本字符串真正弄清楚任何事情,如果您确实发现了其他问题,请随时关注我
    猜你喜欢
    • 1970-01-01
    • 2021-02-06
    • 1970-01-01
    • 1970-01-01
    • 2021-04-19
    • 1970-01-01
    • 2021-08-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多