Room - это абстракция над SQLite, которая предоставляет удобный способ работы с базой данных в Android. Библиотека состоит из трех основных компонентов, которые работают вместе для обеспечения удобного доступа к данным.
@Entity(tableName = "users")
data class User(
@PrimaryKey(autoGenerate = true) val id: Int,
@ColumnInfo(name = "user_name") val name: String,
@ColumnInfo val age: Int,
@Ignore val temporaryNote: String?
)
Назначение:
Ключевые аннотации:
@Entity
- помечает класс как сущность@PrimaryKey
- определяет первичный ключ@ColumnInfo
- настраивает колонки таблицы@Ignore
- исключает поле из таблицы@Dao
interface UserDao {
@Insert
suspend fun insert(user: User)
@Update
suspend fun update(user: User)
@Delete
suspend fun delete(user: User)
@Query("SELECT * FROM users")
fun getAllUsers(): LiveData<List<User>>
@Query("SELECT * FROM users WHERE age > :minAge")
fun getUsersOlderThan(minAge: Int): Flow<List<User>>
}
Назначение:
Ключевые аннотации:
@Dao
- помечает интерфейс как DAO@Insert
, @Update
, @Delete
- стандартные операции@Query
- для произвольных SQL-запросовsuspend
)@Database(
entities = [User::class, Product::class],
version = 1,
exportSchema = false
)
abstract class AppDatabase : RoomDatabase() {
abstract fun userDao(): UserDao
abstract fun productDao(): ProductDao
companion object {
@Volatile
private var INSTANCE: AppDatabase? = null
fun getDatabase(context: Context): AppDatabase {
return INSTANCE ?: synchronized(this) {
val instance = Room.databaseBuilder(
context.applicationContext,
AppDatabase::class.java,
"app_database"
).build()
INSTANCE = instance
instance
}
}
}
}
Назначение:
Ключевые особенности:
@Database
- аннотация для класса базы данныхclass Converters {
@TypeConverter
fun fromTimestamp(value: Long?): Date? = value?.let { Date(it) }
@TypeConverter
fun dateToTimestamp(date: Date?): Long? = date?.time
}
@Database(entities = [...], version = 1)
@TypeConverters(Converters::class)
abstract class AppDatabase : RoomDatabase() {...}
Назначение:
val MIGRATION_1_2 = object : Migration(1, 2) {
override fun migrate(database: SupportSQLiteDatabase) {
database.execSQL("ALTER TABLE users ADD COLUMN last_login INTEGER")
}
}
Room.databaseBuilder(...)
.addMigration(MIGRATION_1_2)
.build()
Назначение:
Room состоит из трех основных компонентов - Entity (модель данных), DAO (доступ к данным) и Database (центральная точка входа). Дополнительные возможности включают TypeConverters для работы со сложными типами и Migrations для управления версиями БД. Такая архитектура обеспечивает типобезопасность, удобство работы и высокую производительность при доступе к данным.