对 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/