首页 文章

Android架构组件:使用枚举

提问于
浏览
17

是否可以使用新的Android架构组件和房间持久性库将Enum类型用作Entity类中的嵌入字段?

我的实体(带有嵌入式枚举):

@Entity(tableName = "tasks")
public class Task extends SyncEntity {

    @PrimaryKey(autoGenerate = true)
    String taskId;

    String title;

    /** Status of the given task.
     * Enumerated Values: 0 (Active), 1 (Inactive), 2 (Completed)
     */
    @Embedded
    Status status;

    @TypeConverters(DateConverter.class)
    Date startDate;

    @TypeConverters(StatusConverter.class)
    public enum Status {
        ACTIVE(0),
        INACTIVE(1),
        COMPLETED(2);

        private int code;

        Status(int code) {
            this.code = code;
        }

        public int getCode() {
            return code;
        }
    }
}

我的TypeConverter:

public class StatusConverter {

    @TypeConverter
    public static Task.Status toStatus(int status) {
        if (status == ACTIVE.getCode()) {
            return ACTIVE;
        } else if (status == INACTIVE.getCode()) {
            return INACTIVE;
        } else if (status == COMPLETED.getCode()) {
            return COMPLETED;
        } else {
            throw new IllegalArgumentException("Could not recognize status");
        }
    }

    @TypeConverter
    public static Integer toInteger(Task.Status status) {
        return status.getCode();
    }
}

当我编译这个时,我得到一个错误,说'错误:(52,12)错误:实体和Pojos必须有一个可用的公共构造函数 . 您可以拥有一个空构造函数或构造函数,其参数与字段匹配(按名称和类型) .

Update 1 我的SyncEntity类:

/ ** *同步的所有Room实体的基类 . * /

@Entity
public class SyncEntity {

    @ColumnInfo(name = "created_at")
    Long createdAt;

    @ColumnInfo(name = "updated_at")
    Long updatedAt;
}

1 回答

  • 30

    我可以在 Room 使用 TypeConverters 的枚举值 . 您的代码中有一些要更改的部分:

    1) 您必须声明您的实体's fields public or they must have public getters/setters. Or you' ll得到以下错误:

    yourField在YourEntity中不公开;无法从外部包裹访问

    2) 您的 status 字段不需要 @Embedded 注释 . 它适用于嵌套对象 . More from docs.

    3) 您没有在正确的位置使用 @TypeConverters 注释 . 在您的情况下,它可以设置在 status 字段上方 . More from docs.

    4) 您必须为您的实体定义构造函数,否则您将收到以下错误:

    实体和Pojos必须具有可用的公共构造函数 . 您可以拥有一个空构造函数或其参数与字段匹配的构造函数(按名称和类型) .

    您可以定义一个空构造函数来跳过此错误 .

    5) 在TypeConverter中使用int而不是Integer .

    和;以下按预期工作:

    @Entity(tableName = "tasks")
    public class Task extends SyncEntity {
    
        @PrimaryKey(autoGenerate = true)
        public String taskId;
    
        public String title;
    
        /** Status of the given task.
         * Enumerated Values: 0 (Active), 1 (Inactive), 2 (Completed)
         */
        @TypeConverters(StatusConverter.class)
        public Status status;
    
        @TypeConverters(DateConverter.class)
        public Date startDate;
    
        // empty constructor 
        public Task() {
        }
    
        public enum Status {
            ACTIVE(0),
            INACTIVE(1),
            COMPLETED(2);
    
            private int code;
    
            Status(int code) {
                this.code = code;
            }
    
            public int getCode() {
                return code;
            }
        }
    }
    

相关问题