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
注释类型(interface
或 abstract 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/
.
我目前正在研究一本学习书,该书利用 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
注释类型(interface
或 abstract 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/
.