← Назад к вопросам

Какой тип должен иметь класс использующий Room?

1.0 Junior🔥 164 комментариев
#Работа с данными

Комментарии (4)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Ответ на вопрос о типе класса, использующего Room

В контексте Android-разработки с использованием библиотеки Room Persistence Library, класс, который будет непосредственно использоваться Room, должен иметь аннотацию @Entity. Это фундаментальный тип, который представляет таблицу в базе данных SQLite.

Основной тип: @Entity

Класс, помеченный аннотацией @Entity, становится отображением таблицы в базе данных. Это data class (в Kotlin) или POJO (в Java), свойства/поля которого соответствуют столбцам таблицы.

Пример на Kotlin:

@Entity(tableName = "users")
data class User(
    @PrimaryKey(autoGenerate = true)
    val id: Long = 0,
    
    @ColumnInfo(name = "user_name")
    val userName: String,
    
    val email: String,
    
    @Ignore
    val temporaryNote: String? = null
)

Ключевые аспекты класса @Entity:

  • Аннотация @Entity: Обязательная аннотация, указывающая Room, что этот класс является сущностью.
  • tableName: Опциональный параметр для указания имени таблицы (по умолчанию используется имя класса).
  • @PrimaryKey: Поле, помеченное этой аннотацией, становится первичным ключом таблицы. Параметр autoGenerate = true позволяет автоматически генерировать уникальные ID.
  • @ColumnInfo: Позволяет кастомизировать имя столбца или другие свойства (например, collate).
  • @Ignore: Указывает Room не сохранять это поле в базе данных.

Дополнительные типы классов в экосистеме Room

Помимо @Entity, в архитектуре Room используются другие ключевые типы классов:

@Dao (Data Access Object)

Интерфейс или абстрактный класс, содержащий методы для доступа к базе данных. Определяет CRUD-операции (Create, Read, Update, Delete) для сущностей.

Пример:

@Dao
interface UserDao {
    @Insert
    suspend fun insert(user: User): Long
    
    @Query("SELECT * FROM users WHERE id = :userId")
    suspend fun getUserById(userId: Long): User?
    
    @Update
    suspend fun update(user: User): Int
    
    @Delete
    suspend fun delete(user: User): Int
}

@Database

Абстрактный класс, расширяющий RoomDatabase, который является центральной точкой доступа к базе данных. Он должен:

  • Быть аннотирован @Database с перечислением всех сущностей и версией базы данных.
  • Содержать абстрактные методы, возвращающие экземпляры @Dao.

Пример:

@Database(
    entities = [User::class],
    version = 1,
    exportSchema = true
)
abstract class AppDatabase : RoomDatabase() {
    abstract fun userDao(): UserDao
}

TypeConverters (необязательно)

Классы, содержащие методы для преобразования сложных типов данных (например, Date, List<String>, кастомных объектов) в примитивные типы, которые может хранить SQLite.

Пример:

class Converters {
    @TypeConverter
    fun fromTimestamp(value: Long?): Date? {
        return value?.let { Date(it) }
    }
    
    @TypeConverter
    fun dateToTimestamp(date: Date?): Long? {
        return date?.time
    }
}

Практическая рекомендация по архитектуре

В современных Android-приложениях с использованием MVVM или MVI паттернов, классы Room (@Entity, @Dao, @Database) обычно являются частью слоя данных (Data Layer). Они инкапсулируют локальное хранение, в то время как:

  • Repository — координирует данные из различных источников (Room, сеть, предпочтения).
  • ViewModel — предоставляет данные UI-слою, абстрагируя источники данных.

Вывод

Таким образом, прямой ответ на вопрос: класс, использующий Room, должен иметь тип @Entity, если мы говорим о классе-модели данных. Однако для полноценной работы с Room требуется целый набор специализированных типов классов: @Entity для таблиц, @Dao для операций доступа и @Database для управления базой данных. Это три кита, на которых строится вся работа с локальной базой данных в Android-приложениях с использованием Room.