gpt4 book ai didi

android - 它是如何工作的 : passing an abstract class as parameter in Room Database builder

转载 作者:行者123 更新时间:2023-11-30 05:07:05 25 4
gpt4 key购买 nike

我在 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 方法的情况下直接传递抽象类?

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

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

最佳答案

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

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

 .fallbackToDestructiveMigration()

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

关于android - 它是如何工作的 : passing an abstract class as parameter in Room Database builder,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54386798/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com