Библиотека комнат — как интерфейс DAO связан с базой данных?

#android #database #sqlite #annotations #android-room

Вопрос:

В настоящее время я работаю над учебником, в котором используется библиотека Room для доступа к базе данных SQLite на Android.

В этой книге класс базы данных создается следующим образом:

 @Database(entities = {WorkTime.class}, version = 1)
public abstract class WorkTimeDatabase extends RoomDatabase {
    public abstract WorkTimeDao workTimeDato();
 

Меня действительно смущает метод, объявленный в этом классе. Что он делает? Тело метода нигде не объявлено. Я знаю, что абстрактные методы не нужно определять, они абстрактны, что в основном означает, что они функционируют как интерфейс. Но я вызываю эту функцию из своей основной активности:

 getApp().getDb().workTimeDato().add(workTime);
 

getApp().getDb() возвращает экземпляр класса WorkTimeDatabase -. Но что же workTimeDato() делать?

Я думаю, что это связано с Комнатой, а не с конкретным примером, который я рассматриваю в своей книге. Вот почему я размещаю этот вопрос здесь.

Может ли быть так, что каким-то образом этот workTimeDato() метод связан с интерфейсом WorkTimeDao, который мне пришлось создать? Так и должно быть, потому что я нигде не реализую этот интерфейс. Я только что прокомментировал этот интерфейс @Dao .

Может ли кто-нибудь объяснить мне, что происходит?

Ответ №1:

Меня действительно смущает метод, объявленный в этом классе. Что он делает?

Он вернет экземпляр WorkTimeDao объекта. Учитывая, как настроена комната, WorkTimeDao должен быть @Dao аннотированный тип ( interface или abstract class ).

Может ли быть так, что каким-то образом этот метод workTimeDato() связан с интерфейсом WorkTimeDao, который мне пришлось создать?

ДА. Если вы посмотрите на возвращаемый тип workTimeDato() , он возвращает экземпляр WorkTimeDao .

Комната будет кодировать-генерировать класс , который реализует WorkTimeDao , и он будет кодировать-генерировать класс, который реализует WorkTimeDatabase . Эти классы, созданные кодом, будут работать с API, который вы описали (например, методы, объявленные в WorkTimeDao ), и требованиями к помещению, которые вы привязали к ним (например, выполнение запросов из @Query аннотированных методов на вашем @Dao ).

Во время выполнения, когда вы используете RoomDatabase.Builder для получения доступа к своей базе данных, в то время как вы будете ссылаться на нее, используя абстрактные типы, которые вы написали, базовые объекты будут из этих классов, созданных кодом.

Вы найдете источник для классов, созданных с помощью кода, в build/ каталоге вашего модуля. Для проекта Котлина они будут участвовать build/generated/source/kapt/ . Для такого Java-проекта, как ваш, они были бы в build/generated/source/apt/ деле .

Комментарии:

1. знает ли библиотека комнат, что ей нужно создать объект Dao и вернуть его только из возвращаемого типа метода?

2. @Лук: Предположительно, да.