代码之家  ›  专栏  ›  技术社区  ›  Gissipi_453

工作原理:在Room Database builder中作为参数传递抽象类

  •  1
  • Gissipi_453  · 技术社区  · 6 年前

    我在Room数据库中看到了这个实现。

    应用数据库

    @Database(entities = {Task.class}, version = 1) 
    public abstract class AppDatabase extends RoomDatabase {
        public abstract TaskDao taskDao();
    }
    

    AppDatabase appDatabase =  
    Room.databaseBuilder(context, AppDatabase.class, "something").build();
    

    我的问题是-

    1. 在没有定义重写方法的情况下,如何像这样直接传递抽象类?

      比如,通常我们不会这样使用和传递抽象类,如果在IDE中执行类似操作,它会抛出一个错误。

    2. 这是哪种设计模式?房间内部是如何处理这类事情的?

    1 回复  |  直到 5 年前
        1
  •  2
  •   Levi Moreira    6 年前

     .fallbackToDestructiveMigration()
    

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

    推荐文章