我已经在Room数据库中看到了此实现。
有一个抽象类 AppDatabase -
@Database(entities = {Task.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
public abstract TaskDao taskDao();
}
但是,当您创建此AppDatabase类的Object时,您将执行以下操作-
AppDatabase appDatabase =
Room.databaseBuilder(context, AppDatabase.class, "something").build();
我的问题是-
如何在没有定义Override方法的情况下直接传递Abstract类?
就像,通常我们不使用并传递这样的抽象类,如果您在IDE中执行类似的操作,则会引发错误。
这是哪个设计模式,以及Room如何在内部处理此类事情?
答案 0 :(得分:0)
1)使用抽象类的想法是在开发人员和房间之间建立某种契约。我们使用抽象类(或接口),因为这些Dao方法的实现不是由开发人员提供,而是由Room本身提供。
2)这是一个Builder设计模式,当我们有很多选择要创建最终对象的方式时,通常会使用此设计模式,并且该模式提供了更易于维护的api。您提供的示例只是数据库的基本初始化,但是在构建数据库类时,我们实际上可以设置许多参数。例如,我们可以在构建数据库时添加以下选项,以告知数据库删除所有内容,并在数据库模式更改时重新启动:
.fallbackToDestructiveMigration()
Rooms是如何内部处理事物的,这是一个棘手的问题,但一般来说,它是android本身提供的SQL API的抽象层,它将为Daos和数据库使用您的合同(抽象类或接口)为了为那些类中定义的所有抽象方法创建实现。一旦完成所有设置并首次构建了项目,Room将生成一堆_Impl类,这些类将实现这些抽象方法。例如,如果您有一个UserDao,它将生成一个UserDao_Impl类,该类扩展(或在使用接口的情况下实现)原始UserDao并将提供这些实现。它在内部执行的操作将取决于方法,但基本上是使用Android提供的SQLite API。