Android 处理实体和POJO

Android 处理实体和POJO,android,android-sqlite,android-room,android-architecture-components,Android,Android Sqlite,Android Room,Android Architecture Components,虽然我发现的大多数教程都与简单的表格和积垢操作有关,但我还是对Room比较陌生,所以我一直坚持改进这一点 让我们以这个结构为例 用户实体 @Entity(tableName = "users") public class UsersEntity{ @PrimaryKey(autoGenerate = true) private long id; @NonNull private String name; @NonNull private lo

虽然我发现的大多数教程都与简单的表格和积垢操作有关,但我还是对Room比较陌生,所以我一直坚持改进这一点

让我们以这个结构为例

用户实体

@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;
    }
第一个问题:
实体
对象是否也应该扩展以替换
POJO
?或者将实体和POJO作为单独的类

从房间设置扩展,我看到用户POJO的方式是:

public class User{
   private long id;
   private Role role;
}
基本上,如果用户是来自web服务的json响应,或者用户在应用程序的输入字段中输入json响应,那么这种设置应该可以工作

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

userDAO.insertRole(userId)

但是如何使用Room和userDAO获得用户的
角色
对象呢? 我觉得这样做不合适:

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

第三个问题:将表列设置为u(例如
role\u id
)似乎是一种很好的做法,但在java中,建议将
roleId
作为类属性。如果一个
@查询的结果
例如
从…
中选择角色id,以及带有
角色id的POJO
字段将失败,那么查询需要
选择角色id作为角色id…
才能工作。在sqlite中的表/列名中使用camel大小写是一种好的做法吗?

您想要的POJO,可能可以看作是一种视图模型。一般来说,统一/链接实体和POJO是一个坏主意,因为您只是为实体创建了一个很长很宽的可视性/范围,这是不必要的,并且可能会导致潜在的问题

假设您有一个客户机,它需要一些不同的数据可视化,例如,假设您有一个网站公开车辆数据,并且您使用
metric
系统实现了所有功能,因此对于距离
km
,对于速度
km/h
,等等。现在,您的公司从英国获得了一个巨大的客户,他们希望您以
imperial
格式向他们提供数据。现在该怎么办?可能会实施反序列化/转换过程,该过程将获取值并根据用户的上下文进行转换(无论是使用
公制
还是
英制
系统)。如果实体和视图模型对象基本相同,可能会出现什么问题?真糟糕。你们有非常紧密的耦合,你们应该为客户机和数据库实现不同的getter序列化。它可能会变得一团糟

相反,如果将两者分开,您将拥有负责处理数据库的实体,这是一个标准过程,具有较小的变异系数,另一方面,您将拥有视图模型,该模型很可能需要频繁修改,毕竟这是意料之中的,因为它是最终用户的界面