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

Android中如何从Room数据库删除90天以上的历史记录

问题根因

SQLite内置函数strftime('%s', datetime('now', '-90 day'))返回的是秒级Unix时间戳(10位数字),而Android业务代码中存入Room的timestamp字段为毫秒级时间戳(13位数字),两者单位不匹配导致判断条件永远不成立,删除逻辑无法生效。

可行解决方案

方案1:调整SQL语句对齐时间单位

直接在SQL层对计算出的秒级时间戳做放大处理,匹配毫秒级存储的字段:

@Query("DELETE FROM datacaptureinfoalibi WHERE timeStamp <= strftime('%s', datetime('now', '-90 day')) * 1000")
int deleteOlderData();

方案2:代码侧预计算时间阈值(更推荐)

该方式可以避免SQLite时间函数的时区偏差问题,逻辑更可控:

  1. 调整DAO层方法定义,接收外部传入的时间阈值:
@Query("DELETE FROM datacaptureinfoalibi WHERE timeStamp <= :thresholdTimestamp")
int deleteOlderData(long thresholdTimestamp);
  1. 业务调用侧提前计算90天前的毫秒级时间戳,传入方法执行:
// Kotlin 示例
val ninetyDaysAgo = System.currentTimeMillis() - 90 * 24 * 60 * 60 * 1000L
val deletedRowCount = yourDaoInstance.deleteOlderData(ninetyDaysAgo)
// Java 示例
long ninetyDaysAgo = System.currentTimeMillis() - 90 * 24 * 60 * 60 * 1000L;
int deletedRowCount = yourDaoInstance.deleteOlderData(ninetyDaysAgo);
验证建议

方法返回的deletedRowCount为实际删除的记录行数,可通过该值判断逻辑是否生效。如果返回值为0,可在测试环境分别打印阈值和表中存储的timestamp字段值,确认数值范围、单位是否匹配。

内容的提问来源于stack exchange,提问作者Chirag Patel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 19:24:02