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时间函数的时区偏差问题,逻辑更可控:
- 调整DAO层方法定义,接收外部传入的时间阈值:
@Query("DELETE FROM datacaptureinfoalibi WHERE timeStamp <= :thresholdTimestamp") int deleteOlderData(long thresholdTimestamp);
- 业务调用侧提前计算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
相关产品推荐
相关产品推荐

