是否可以使用新的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 回答
我可以在
Room
使用TypeConverters
的枚举值 . 您的代码中有一些要更改的部分:1) 您必须声明您的实体's fields public or they must have public getters/setters. Or you' ll得到以下错误:
2) 您的
status
字段不需要@Embedded
注释 . 它适用于嵌套对象 . More from docs.3) 您没有在正确的位置使用
@TypeConverters
注释 . 在您的情况下,它可以设置在status
字段上方 . More from docs.4) 您必须为您的实体定义构造函数,否则您将收到以下错误:
您可以定义一个空构造函数来跳过此错误 .
5) 在TypeConverter中使用int而不是Integer .
和;以下按预期工作: