Ali*_*lin 4 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;
}
Run Code Online (Sandbox Code Playgroud)
角色实体
@Entity(tableName = "roles")
public class RolesEntity{
@PrimaryKey(autoGenerate = true)
private long id;
@NonNull
private String name;
}
Run Code Online (Sandbox Code Playgroud)
第一个问题:是否应该Entity扩展对象以替换POJO?或者将实体和POJO作为单独的类?
从Room设置扩展,我看到User POJO的方式是:
public class User{
private long id;
private Role role;
}
Run Code Online (Sandbox Code Playgroud)
基本上,如果用户将来自Web服务的json响应或用户在应用程序的输入字段中输入,则此设置应该都有效.
但是,这引出了第二个问题:如何插入和检索用户信息?插入似乎是可能的,因为可能有类似的东西
userDAO.insertRole(userId)
但是如何Role通过使用Room和userDAO来获取User 的对象?我发现不适合做以下事情:
user = userDao.getUser(userId)
user.setRole(roleDao.getRole(user.getRoleId)
Run Code Online (Sandbox Code Playgroud)
第三个问题:将表列与_(例如role_id)表示似乎是一个好习惯,但在java roleId中建议使用类属性.如果的结果@Query,例如select role_id from...,并与该POJO roleId领域,将无法因此查询必须select role_id as roleId...得到它的工作.在sqlite中使用表/列名称中的camel case是一个好习惯吗?
你打算作为POJO,可能被视为一种视图模型.一般来说,统一/链接实体和pojos是一个坏主意,因为你只是为实体做了更广泛的可见性/范围,在没有必要的情况下可能导致潜在的问题.
假设您有一些需要对数据进行不同可视化的客户端,例如想象您有一个公开车辆数据的网站,并且您已经使用metric系统实现了所有内容,因此您可以获得距离km,速度km/h等等.现在,您的公司从英国获得了一个庞大的客户,他们希望您以imperial格式提供数据.现在做什么?可能实施一个去除/转换过程,该过程接受值并根据用户的上下文(无论是使用metric还是imperial系统)转换它们.如果您的实体和视图模型对象基本相同,可能会出现什么问题?真的很糟糕的东西.你有真正紧密耦合的东西,你应该为客户端实现不同的getter序列化,对于db..it可能会变得一团糟.
相反,如果将两者分开,您将拥有负责处理数据库的实体,这是具有较小变异系数的标准程序,另一方面,您将拥有很可能需要频繁修改的视图模型毕竟是预期的,因为它是最终用户的接口.