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

使用Room KSP时kotlin.time.Duration无法转换的问题

解决Room数据库中kotlin.time.Duration转换器的编译错误

1. 修复@TypeConverters的拼写错误

你在数据库类的注解里出现了低级拼写错误:

@TypeConverters(DurationConverter::clas)

修正为正确的类引用:

@TypeConverters(DurationConverter::class)

少写字母s会导致Room无法正确识别转换器类,这是触发错误的核心原因之一。

2. 确保Duration类型的导入正确

检查转换器类中是否正确导入Kotlin标准库的Duration类型:

import kotlin.time.Duration
import kotlin.time.milliseconds

若未正确导入,KSP会无法识别方法的参数/返回值类型,进而判定转换器方法无效。

3. 验证转换器方法的合规性

你的方法签名本身符合要求,但需确认:

  • 对于object实现的转换器,必须添加@JvmStatic注解,让Room能识别为静态方法
  • 双向转换方法(Long? ↔ Duration?)需覆盖null场景,避免Room处理空值时出错

4. 辅助排查步骤

如果上述修正后仍有问题,可尝试:

  • 执行./gradlew clean清理项目缓存后重新编译
  • 确认Room、KSP、Kotlin版本的兼容性(你的当前版本组合是兼容的,若仍有异常可尝试升级Room到2.6.x稳定版)

修正后的完整代码示例

转换器类:

import kotlin.time.Duration
import kotlin.time.milliseconds
import androidx.room.TypeConverter

object DurationConverter {
    @JvmStatic
    @TypeConverter
    fun toDuration(millis: Long?): Duration? = millis?.milliseconds

    @JvmStatic
    @TypeConverter
    fun fromDuration(duration: Duration?): Long? = duration?.inWholeMilliseconds
}

数据库类:

import androidx.room.Database
import androidx.room.RoomDatabase
import androidx.room.TypeConverters

@Database(
    entities = [ /* 你的实体类 */ ],
    version = 1
)
@TypeConverters(DurationConverter::class)
abstract class AppDatabase : RoomDatabase() {
    /* DAO定义 */
}

内容的提问来源于stack exchange,提问作者Lionel Briand

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 21:42:53