Запросы и связи
Получайте данные запросами и связывайте сущности
«Запросы и связи» — бесплатный урок Android Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Android Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Android Academy содержит 4 уроков всего.
Выход за пределы одной таблицы
В реальных приложениях есть связанные данные: у пользователя много публикаций, у заказа много товаров. Room моделирует такие связи с помощью внешних ключей и аннотации @Relation.
Параметризованные запросы
Передавайте аргументы в @Query с префиксом в виде двоеточия.
@Query("SELECT * FROM users WHERE name LIKE :search")
suspend fun search(search: String): List<User>Возврат агрегатных значений
Запросы могут возвращать скалярные значения, например количество записей.
@Query("SELECT COUNT(*) FROM users")
suspend fun count(): IntОпределение внешнего ключа
Дочерняя сущность ссылается на родительскую с помощью @ForeignKey. Это обеспечивает ссылочную целостность на уровне базы данных.
@Entity(
foreignKeys = [ForeignKey(
entity = User::class,
parentColumns = ["id"],
childColumns = ["userId"]
)]
)
data class Post(
@PrimaryKey val id: Int,
val userId: Int,
val title: String
)Индексация внешних ключей
Room рекомендует индексировать столбцы внешних ключей для повышения производительности запросов. Добавьте @Index.
@Entity(
indices = [Index("userId")]
)
data class Post(/* ... */ val userId: Int)Поведение onDelete
Определите, что произойдёт с дочерними записями при удалении родительской, например используйте CASCADE, чтобы удалить их тоже.
ForeignKey(
entity = User::class,
parentColumns = ["id"],
childColumns = ["userId"],
onDelete = ForeignKey.CASCADE
)Моделирование связи «один ко многим»
Создайте класс, объединяющий родительскую сущность с дочерними, с помощью @Embedded и @Relation.
data class UserWithPosts(
@Embedded val user: User,
@Relation(
parentColumn = "id",
entityColumn = "userId"
)
val posts: List<Post>
)Запрос связанной структуры
Возвращайте объединённый класс из DAO. Room выполняет дополнительный запрос и объединяет объекты.
@Transaction
@Query("SELECT * FROM users")
suspend fun getUsersWithPosts(): List<UserWithPosts>Зачем здесь @Transaction
Поскольку Room выполняет два запроса (сначала для родительских, затем для дочерних объектов), обёртывание метода в @Transaction обеспечивает согласованный снимок данных без промежуточных записей.
Связь «многие ко многим» с таблицей-связкой
Для связи «многие ко многим» (студенты и курсы) используйте таблицу-связку и параметр associateBy аннотации @Relation.
@Relation(
parentColumn = "studentId",
entityColumn = "courseId",
associateBy = Junction(Enrollment::class)
)
val courses: List<Course>Итоги по связям
@ForeignKeyобеспечивает целостность данных и правила каскадных операций.@Relation+@Embeddedсобирают связанные объекты.@Transactionсохраняет согласованность чтения из нескольких запросов.
Быстрая проверка
Проверьте своё понимание связей.
Повторение
Вы научились:
- Параметризовать запросы с помощью
:nameи возвращать агрегированные данные. @ForeignKeyобеспечивает целостность данных с помощью правилonDelete.@Relation+@Embeddedсоздают связанные объекты; оборачивать чтение в@Transaction.
Часто задаваемые вопросы
Урок «Запросы и связи» бесплатный?
Да — полный текст урока «Запросы и связи» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Android Academy, подпишись на CoddyKit PRO. Курс Android Academy содержит 4 уроков всего.
Чему я научусь в уроке «Запросы и связи»?
Получайте данные запросами и связывайте сущности Ты практикуешь Android Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Android Academy?
Предыдущий опыт не требуется. Android Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Запросы и связи»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Android Academy?
Да. Каждый урок Android Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.