处理实体和 Pojo

Handling Entities and Pojos

对 Room 仍然是新手,虽然我发现的大多数教程都与简单的 table 和 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 作为单独的 classes?

从 Room 设置扩展,我看到用户 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)

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

你想说的POJO,大概可以看成是一种view model。一般来说,unify/link 实体和 pojos 不是一个好主意,因为你只是在为实体做一个更宽的 visibilty/scope,这是没有必要的,并且可能会导致潜在的问题。

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

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