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

Kotlin中如何根据数据类id获取timestamp并修复旧消息删除逻辑?

问题分析与解决方案

你的代码核心问题在于:循环中始终使用传入的同一个msg对象的属性,而非对应id=i的消息数据。

你传入的msg是单个消息实例,每次调用msg.detalles()拿到的都是这个消息的id和timestamp,不是循环变量i对应的那条消息的属性。这就导致只有当这个传入的消息的timestamp满足条件时,才会触发删除逻辑,但此时删除的却是i对应的id,最终出现"仅最后一条消息超时才删除"的异常表现。


正确实现方式

方式1:查询所有消息,逐个判断删除

先从数据库获取所有消息,再遍历判断是否需要删除:

fun borrarMensajesViejos() = scope.launch {
    val nowUnixtime = System.currentTimeMillis()
    // 从数据库获取全部消息,需在你的MessageDao中实现getAllMessages()方法
    val allMessages = messageDao.getAllMessages()
    
    allMessages.forEach { message ->
        if (message.timestamp <= nowUnixtime - 20000) {
            chatManager.deleteMessage(id = message.id)
            Log.i(TAG, "Se ha borrado el mensaje ${message.id}")
        }
    }
}

方式2:用Room直接执行批量删除(更高效)

通过Room的查询语句,一次性删除所有符合条件的消息,避免遍历开销:

  1. 在MessageDao中添加删除方法:
@Dao
interface MessageDao {
    // 其他已有方法...
    @Query("DELETE FROM messages WHERE timestamp <= :threshold")
    suspend fun deleteOldMessages(threshold: Long)
}
  1. 调用该方法完成批量删除:
fun borrarMensajesViejos() = scope.launch {
    val threshold = System.currentTimeMillis() - 20000
    messageDao.deleteOldMessages(threshold)
    Log.i(TAG, "Se han borrado todos los mensajes antiguos")
}

原代码的其他问题补充

  • 循环从i=0开始,但你的id是自动生成的(autoGenerate=true),通常数据库自增ID从1开始,i=0的删除操作大概率无效。
  • 依赖传入的msg.id作为循环上限不合理,应该直接从数据库查询消息列表,而非单个消息的ID。

内容的提问来源于stack exchange,提问作者Jaime Silvestre

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 20:45:31