android - 处理实体和 Pojo

标签 android android-sqlite android-room android-architecture-components

对 Room 来说仍然是新手,虽然我发现的大多数教程都与简单的表和 CRUD 操作有关,但我坚持要改进它。

让我们来看看这个示例结构。

用户实体

@Entity(tableName = "users")

public class UsersEntity{
    @PrimaryKey(autoGenerate = true)
    private long id;

    @NonNull
    private String name;

    @NonNull
    private long roleId;
}

角色实体

  @Entity(tableName = "roles")

    public class RolesEntity{
        @PrimaryKey(autoGenerate = true)
        private long id;

        @NonNull
        private String name;
    }

第一个问题:是否应该扩展Entity 对象来替代POJO?或者将实体和 POJO 作为单独的类?

从 Room 设置扩展,我看到 User POJO 的方式是:

public class User{
   private long id;
   private Role role;
}

基本上,如果用户作为来自 Web 服务的 json 响应出现,或者由用户在应用程序的输入字段中输入,则此设置应该都有效。

然而,这引发了第二个问题:如何插入和检索用户信息?。 插入似乎是可能的,因为可能有类似

userDAO.insertRole(userId)

但是如何使用 Room 和 userDAO 获取 User 的 Role 对象呢? 我发现做这样的事情是不合适的:

user = userDao.getUser(userId)
user.setRole(roleDao.getRole(user.getRoleId)

第三个问题:让表列带有_(例如role_id)似乎是一个好习惯,但在java中,建议将roleId作为类属性。如果 @Query 的结果,例如 select role_id from... 和带有 roleId 字段的 POJO,将失败,因此查询需要select role_id as roleId... 让它工作。在 sqlite 中的表/列名称中使用驼峰式大小写是一种好习惯吗?

最佳答案

你打算作为 POJO 的东西,可能可以看作是一种 View 模型。一般来说,统一/链接实体和 pojo 不是一个好主意,因为您只是在为实体建立更广泛的可见性/范围,这是不必要的,并且可能会导致潜在的问题。

假设您有一些客户端需要一些不同的数据可视化,例如假设您有一个公开车辆数据的网站并且您已经使用 metric 系统实现了所有内容,所以对于距离,您有km,表示速度 km/h 等。现在您的公司获得了来自英国的大客户,他们希望您以 imperial 格式向他们提供数据。现在要做什么?可能实现反序列化/转换过程,该过程获取值并根据用户的上下文(无论他们使用的是 metric 还是 imperial 系统)转换它们。如果您的实体和 View 模型对象基本相同,可能会出现什么问题?真的很糟糕。你的事情真的很紧密,你应该为客户端的序列化实现不同的 getter,对于 db..它可能会变得一团糟。

相反,如果将两者分开,您将拥有负责处理数据库的实体,这是变异系数小的标准程序,而另一方面,您将拥有 View 模型,这很可能需要经常修改,毕竟它是预期的,因为它是最终用户的接口(interface)。

关于android - 处理实体和 Pojo,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50956975/

相关文章:

android - 如何使用协同程序在 Room db 中获取插入查询的 ID

android - Room db-按别名排序无法在分组依据查询中使用

android - 使用可绘制对象针对 Android 1.6 - 4.0.3

java - 通过 PHONE.CONTENT_URI 检索联系人返回重复行

android - 禁用时更改开关颜色

android - AsyncTaskLoader vs AsyncTask 用于在编辑单个实体 Activity 中加载单个实体?

android - 使用 ID 删除多行?

java - 如果我在房间中使用外键,它会将数据保存在其表中还是单独的表中?

android - 如何在android中的app_name旁边添加图标

android - 拖动 faSTLy 后 OnD​​ragListener 未收到回调