0Pricing
Android Academy · Урок

Запросы и связи

Получайте данные запросами и связывайте сущности

«Запросы и связи» — бесплатный урок 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 — локальная установка не требуется.

Все уроки этого курса

  1. Сущности и DAO
  2. Класс базы данных Room
  3. Запросы и связи
  4. Наблюдение за данными с Flow
← Назад к Android Academy