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的查询语句,一次性删除所有符合条件的消息,避免遍历开销:
- 在
MessageDao中添加删除方法:
@Dao interface MessageDao { // 其他已有方法... @Query("DELETE FROM messages WHERE timestamp <= :threshold") suspend fun deleteOldMessages(threshold: Long) }
- 调用该方法完成批量删除:
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
相关产品推荐
相关产品推荐

