【发布时间】:2019-07-24 16:55:14
【问题描述】:
我正在尝试覆盖 Android Room 实体对象的创建。
我想在从数据库实例化对象时初始化其他属性。我关注了Android Room Entity Documentation
我正在使用 Room 版本:room-runtime:2.1.0
我尝试在 setter 和构造函数中记录消息,但没有消息出现在我的 LogCat 中。
@Entity
// EDIT AFTER SOLUTION. You have to do this in the class that room is using to query the data, in my case it was a viewModel.
public class Client /* or ImportantInformationsClientViewModel */ {
@SerializedName("azEMail")
private String azEMail;
@SerializedName("azFirstName")
private String azFirstName;
@SerializedName("azMobile")
private String azMobile;
@Ignore
private MyMobileObject;
public Client(String azEMail, String azFirstName, String azMobile) {
Log.d("CLIENT_LOG", "Constructor is instanciated"); // Never logged
this.azEMail = azEMail;
this.azFirstName = azFirstName;
this.azMobile = azMobile;
// I would like to instantiate MyMobileObject each time this constructor (or the setter) is called
}
public String getAzEMail() {
return azEMail;
}
public void setAzEMail(String azEMail) {
Log.d("CLIENT_LOG", "Setter is called"); // Never Logged
this.azEMail = azEMail;
}
public String getAzFirstName() {
return azFirstName;
}
public void setAzFirstName(String azFirstName) {
this.azFirstName = azFirstName;
}
public String getAzMobile() {
return azMobile;
}
public void setAzMobile(String azMobile) {
this.azMobile = azMobile;
// I would like to instantiate MyMobileObject each time this setter (or the constructor) is called
}
public String getAzName() {
return azName;
}
public void setAzName(String azName) {
this.azName = azName;
}
public void setupObject() {
// One ugly way to fix the problem is to call this method when my object is created. I want to avoid this.
}
}
我发现解决此问题的一种方法是在对象中创建一个setupObject 方法,并在我从查询中获得对象后调用此方法。它确实有效,但这有点难看,而且它毫无意义地增加了更多代码和复杂性。我试图避免这种情况。
是否可以添加将在 android-room 创建对象时调用的特定代码?比如 AzMobile 设置器中的例子?
房间如何实例化对象呢?这些属性是私有的,访问它的唯一方法是通过在 LogCat 中似乎没有调用的设置器。
回答后编辑
房间的棘手之处在于了解我们实体的实现是如何工作的。
我的实体是一个客户端对象,但是当我从数据库中进行查询时,我正在使用 ViewModel 进行查询(类似于 ImportInformationsClientViewModel) 我认为,由于 Room 只知道客户端实体,它会将我的 ViewModel 包装在实体中并从实体神奇地构建它(这不是那么愚蠢..这对我来说很有意义..)
在检查了我的 android-room 生成的 DAO 实现 (ScheduleDao_Impl) 后,我看到这个房间实际上是在直接构建 ViewModel 对象。我只是在 ViewModel 中移动了我的属性和功能,一切正常。
如果我必须列出要知道的重要事项:
android-room仅使用@Entity 构建SQLite 数据库中对象的模型,不使用@Entity 构建查询对象android-room会在你构建应用的时候生成一个YourDao_Impl.java对象,你可以通过CTRL + MAJ + F访问它android-room需要 ctor 或 setter 或两者(它只需要访问所有属性)花几个小时检查您的所有
ApplicationDatabase_Impl文件将帮助您了解 android-room 的工作原理以及所有内容是如何组合在一起的。
【问题讨论】:
-
FWIW,同时添加您正在使用的 Room 版本。
标签: java android android-room