#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. @Лук: Предположительно, да.