Room library - DAO 接口如何与数据库交织在一起?

Room library - how is the DAO interface intertwined with the Database?

我目前正在研究一本学习书,该书利用 Room 库访问 Android 上的 SQLite 数据库。

本书中,数据库class的创建方式如下:

@Database(entities = {WorkTime.class}, version = 1)
public abstract class WorkTimeDatabase extends RoomDatabase {
    public abstract WorkTimeDao workTimeDato();

我真的对这个 class 中声明的方法感到困惑。它有什么作用?方法体没有在任何地方声明。我知道抽象方法不需要定义,它们是抽象的,这基本上意味着它们充当接口。但是我从我的 mainActivity 中调用这个函数:

getApp().getDb().workTimeDato().add(workTime);

getApp().getDb() returns WorkTimeDatabase-class 的一个实例。但是 workTimeDato() 是做什么的呢?

我认为这与 Room 相关,与我在本书中经历的具体示例无关。这就是为什么我 post 在这里提出这个问题。

这个 workTimeDato() 方法会不会与我必须创建的 WorkTimeDao 接口有关?一定是,因为我没有在任何地方实现这个接口。我刚刚用 @Dao.

注释了这个接口

谁能给我解释一下这是怎么回事?

I am really confused by the method that is declared in this class. What does it do?

它将 return 一个 WorkTimeDao 对象的实例。鉴于 Room 的设置方式,WorkTimeDao 应该是 @Dao 注释类型(interfaceabstract class)。

Can it be that somehow this workTimeDato() method is related to the WorkTimeDao interface that I had to create?

是的。如果您查看 workTimeDato() 的 return 类型,它 return 是 WorkTimeDao.

的一个实例

Room 将代码生成实现 WorkTimeDao 的 class,并将代码生成实现 WorkTimeDatabase 的 class。这些代码生成的 classes 将与您描述的 API 一起工作(例如,在 WorkTimeDao 上声明的方法)以及与这些相关的 Room 要求(例如,执行来自 @Query 的查询 - 在您的 @Dao).

上注释的方法

在运行时,当您使用 RoomDatabase.Builder 访问您的数据库时,虽然您将使用您编写的抽象类型引用它,但底层对象将来自这些代码生成的 classes.

您将在模块的 build/ 目录中找到代码生成的 classes 的源代码。对于 Kotlin 项目,它们将在 build/generated/source/kapt/ 中。对于像您这样的 Java 项目,它们将位于 build/generated/source/apt/.