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