我在 Room 数据库中看到了这个实现。
有一个抽象类应用数据库 -
@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 方法的情况下直接传递抽象类?
就像,通常我们不会使用和传递这样的抽象类,如果你在 IDE 中执行类似的操作,它会抛出错误。
-
这是哪种设计模式以及 Room 内部如何处理此类事情?
1)使用抽象类的想法是在开发人员和房间之间建立某种契约。我们使用抽象类(或接口),因为这些 Dao 方法的实现不是由我们开发人员提供,而是由 Room 本身提供。
2)它是一个 Builder 设计模式,当我们有很多选择如何创建最终对象并且该模式提供了一个更易于维护的 api 时,通常会使用此设计模式。您提供的示例只是数据库的基本初始化,但我们实际上可以在构建数据库类时设置许多参数。例如,我们可以在构建数据库时添加以下选项,以便告诉它删除所有内容并重新开始,以防我们的数据库模式发生更改:
.fallbackToDestructiveMigration()
Rooms 如何在内部处理事情是一个有点困难的问题,但总的来说,它是 android 本身提供的 SQL api 的抽象层,它将使用 Daos 和数据库的契约(抽象类或接口),以便为这些类中定义的所有抽象方法创建实现。一旦您完成所有设置并第一次构建项目,Room 将生成一堆 _Impl 类来实现这些抽象方法。例如,如果您有一个 UserDao,它将生成一个 UserDao_Impl 类,该类扩展(或实现,如果您使用了接口)原始 UserDao 并将提供这些实现。它内部做什么取决于方法,但它基本上使用Android提供的SQLite api。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)