当前位置: 首页 > 知识库问答 >
问题:

Android架构组件:使用枚举

欧桐
2023-03-14
@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;
        }
    }
}
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();
    }
}
/**
 * Base class for all Room entities that are synchronized.
 */
@Entity
public class SyncEntity {

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

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

共有1个答案

戎泰
2023-03-14

我可以在房间typeConverters一起使用枚举值。在您的代码中有一些部分需要更改:

1)您必须声明实体的字段是公共的,或者它们必须有公共的getter/setter。否则您将得到以下错误:

yourField在您的实体中不是公共的;无法从外部包访问

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

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;
        }
    }
}
 类似资料:
  • 我知道如何使用ViewModel,Repository和Room将数据从数据库传输到屏幕。但是如何使用POST方法实现登录活动。我需要从ViewModel或AuthorizationRepository创建LiveData isAuthorated吗?有人能展示在android架构组件中使用命令方法的示例吗?

  • 我使用Android导航架构组件来导航一个基于片段的单活动应用程序。主导航通过NavigationDrawer模式实现:带有NavigationView和NavHostFragment plus的DrawerLayout以及附加工具栏。 到目前为止,一切都运行良好——我能够导航到每个片段——除了主级片段的BackStack。除了开始目的地之外的任何片段似乎都被添加到BackStack中,而不是像普

  • 我正在探索新的Android架构组件,并希望将其实现到一个Android应用程序中。当我在iOS开发中使用MVVM时,我对MVVM非常了解。阅读了Google提供的Android Architecture Components guide:https://developer.Android.com/topic/libraries/Architecture/guide.html 我有几个问题...

  • 我目前正在学习新的Android导航架构组件 (https://developer.android.com/topic/libraries/architecture/navigation/). 我有点混淆了它的动机和概念,以下是我的不确定性: Android导航架构组件是否旨在消除在单个应用程序中使用多个活动的需要?这意味着,整个应用程序只需要一个单一活动,所有其他页面都将是片段? 在应用程序中使

  • 我一直在关注Android架构组件LiveData、Room和ViewModel(MVVM)。它为我们节省了使用加载程序和在数据库表上监视数据的麻烦。但我想知道我们是否可以使用LiveData和这种架构来查询Medistore。音频媒体和其他通过ContentProviders提供的Uri。

  • 我正在使用Kotlin,kapt和Android架构组件。当我构建项目时,一切似乎都很好,但在试图在设备/模拟器上运行应用程序后,Gradle的:Assemble任务抛出以下错误: 警告:警告:注释处理器“Android.arch.persistence.room.RoomProcessor”支持的源版本“release_7”小于-source“1.8” 更新 模块构建。在此处分级 项目生成。gr