首页 > 解决方案 > 它是如何工作的:在房间数据库构建器中传递一个抽象类作为参数

问题描述

我在 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();

我的问题是——

  1. 在没有定义 Override 方法的情况下,如何直接传递一个 Abstract 类?

    就像,通常我们不使用和传递这样的抽象类,如果你在 IDE 中做这样的事情,它会抛出一个错误。

  2. 这是哪种设计模式以及 Room 如何在内部处理此类事情?

标签: androiddesign-patternsandroid-room

解决方案


1)使用抽象类的想法是在开发人员和房间之间建立一种契约。我们使用抽象类(或接口),因为这些 Dao 方法的实现不会由我们开发人员提供,而是由 Room 本身提供。

2)它是一种Builder设计模式,这种设计模式通常在我们有很多选择来创建我们的最终对象时使用,并且该模式提供了一个更易于维护的api。您提供的示例只是数据库的基本初始化,但我们实际上可以在构建数据库类时设置许多参数。例如,我们可以在构建数据库时添加以下选项,以告诉它删除所有内容并重新开始,以防我们的数据库架构发生变化:

 .fallbackToDestructiveMigration()

Room 如何在内部处理事情是一个难题,但总的来说,它是 android 本身提供的 SQL api 的抽象层,它将使用 Daos 和数据库的合同(抽象类或接口),以便为这些类中定义的所有抽象方法创建实现。一旦你设置好所有东西并第一次构建你的项目,Room 将生成一堆 _Impl 类来实现这些抽象方法。例如,如果您有一个 UserDao,它将生成一个 UserDao_Impl 类,该类扩展(或实现,如果您使用了接口)原始 UserDao 并且它将提供这些实现。它在内部做什么取决于方法,但它基本上是使用Android提供的SQLite api。


推荐阅读