Android Room实体类使用自定义Priority枚举报错如何解决?
问题原因
Room 默认仅支持整型、浮点型、字符串、布尔值等基础类型的持久化存储,无法直接识别自定义枚举、Date等非基础类型,因此需要显式提供类型转换器,实现自定义类型和Room可存储类型的双向转换。你代码里的Priority枚举和Date类型都需要转换处理,否则都会触发该类报错。
你跟着教程操作仍报错的原因:大概率是教程使用的Room版本在2.3.0及以上,高版本Room默认提供了枚举、Date的基础转换器,不需要手动编写。你当前使用的2.2.5版本没有默认支持,自行实现转换器即可解决。
修复步骤
步骤1:创建自定义类型转换器类
在你的model包下新建Converter类,代码如下:
package com.bawp.todoister.model; import androidx.room.TypeConverter; import java.util.Date; public class Converter { // Priority枚举和String的双向转换 @TypeConverter public static String fromPriority(Priority priority) { return priority == null ? null : priority.name(); } @TypeConverter public static Priority toPriority(String priorityStr) { return priorityStr == null ? null : Priority.valueOf(priorityStr); } // Date和时间戳Long的双向转换 @TypeConverter public static Long fromDate(Date date) { return date == null ? null : date.getTime(); } @TypeConverter public static Date toDate(Long timestamp) { return timestamp == null ? null : new Date(timestamp); } }
步骤2:注册转换器到Room数据库
找到你项目中继承了RoomDatabase的数据库类,在类上添加@TypeConverters注解注册刚才写的转换器:
import androidx.room.Database; import androidx.room.RoomDatabase; import androidx.room.TypeConverters; // 注意@TypeConverters是复数,要和你写的Converter类对应 @Database(entities = {Task.class}, version = 1, exportSchema = false) @TypeConverters({Converter.class}) public abstract class TodoisterDatabase extends RoomDatabase { // 原有DAO定义部分保持不变 public abstract TaskDao taskDao(); }
步骤3:清理重建项目
点击Android Studio顶部菜单的 Build -> Clean Project,等待执行完成后再点击 Build -> Rebuild Project,报错就会消失。
内容的提问来源于stack exchange,提问作者Mohammed Hazari
相关产品推荐
相关产品推荐

