android - 它是如何工作的:在房间数据库构建器中传递一个抽象类作为参数
问题描述
我在 Room 数据库中看到了这个实现。
有一个抽象类AppDatabase -
@Database(entities = {Task.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
public abstract TaskDao taskDao();
}
但是,当您创建此 AppDatabase 类的对象时,您会执行以下操作 -
AppDatabase appDatabase =
Room.databaseBuilder(context, AppDatabase.class, "something").build();
我的问题是——
在没有定义 Override 方法的情况下,如何直接传递一个 Abstract 类?
就像,通常我们不使用和传递这样的抽象类,如果你在 IDE 中做这样的事情,它会抛出一个错误。
这是哪种设计模式以及 Room 如何在内部处理此类事情?
解决方案
1)使用抽象类的想法是在开发人员和房间之间建立一种契约。我们使用抽象类(或接口),因为这些 Dao 方法的实现不会由我们开发人员提供,而是由 Room 本身提供。
2)它是一种Builder设计模式,这种设计模式通常在我们有很多选择来创建我们的最终对象时使用,并且该模式提供了一个更易于维护的api。您提供的示例只是数据库的基本初始化,但我们实际上可以在构建数据库类时设置许多参数。例如,我们可以在构建数据库时添加以下选项,以告诉它删除所有内容并重新开始,以防我们的数据库架构发生变化:
.fallbackToDestructiveMigration()
Room 如何在内部处理事情是一个难题,但总的来说,它是 android 本身提供的 SQL api 的抽象层,它将使用 Daos 和数据库的合同(抽象类或接口),以便为这些类中定义的所有抽象方法创建实现。一旦你设置好所有东西并第一次构建你的项目,Room 将生成一堆 _Impl 类来实现这些抽象方法。例如,如果您有一个 UserDao,它将生成一个 UserDao_Impl 类,该类扩展(或实现,如果您使用了接口)原始 UserDao 并且它将提供这些实现。它在内部做什么取决于方法,但它基本上是使用Android提供的SQLite api。
推荐阅读
- ios - Can not add iOS bundle identifier
- ruby-on-rails - build step 0 "gcr.io/google-appengine/exec-wrapper:latest" failed: exit status 1
- java - How to check if current phones date is today or not
- excel-formula - 如何让 VLookup 为不在 Excel 2010 列表中的条目返回零?
- python - 如何从具有特定度数的节点创建 NetworkX 子图?
- javascript - 对类使用泛型类型
- azure-devops - Visual Studio Teams API giving 203 for 1 company
- sql - SQLITE3 查询 COUNT 和 ORDER BY
- r - variable hline in ggplot with facet: discrete value supplied to continuous scale
- xml - 如果没有正确的属性,XSL 会重复一个值