Sobes.tech
Назад к вопросам
Junior — Middle
106

Какими методами и инструментами ты используешь для взаимодействия с базой данных?

Ответ от нейросети

sobes.tech AI

Что хотят услышать интервьюеры:

Обычно ожидают, что кандидат знает несколько уровней работы с БД: через SQLite напрямую, через ORM/обёртки и через абстракции уровня репозитория. Важно уметь выбрать инструмент под задачу: простые локальные данные, кэш, сложные запросы, миграции, синхронизация. Хорошо, если есть понимание работы с транзакциями, индексами и асинхронным доступом, чтобы не блокировать UI.

Определение:

Для Android взаимодействие с базой данных чаще всего строится вокруг локального хранения данных в SQLite или через более удобные абстракции поверх него. На практике используют Room как надстройку над SQLite, реже — прямой SQLiteOpenHelper, а для простых данных — DataStore или SharedPreferences, если это не полноценная база. Для удалённой базы обычно применяют сетевой слой через API, но это уже не прямой доступ к БД с устройства.

Пример использования:

@Entity(tableName = "users")
data class User(
    @PrimaryKey val id: Long,
    val name: String
)

@Dao
interface UserDao {
    @Query("SELECT * FROM users WHERE id = :id")
    suspend fun getUserById(id: Long): User?

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    suspend fun insert(user: User)
}

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

// Использование в репозитории
class UserRepository(private val dao: UserDao) {
    suspend fun loadUser(id: Long): User? = dao.getUserById(id)
    suspend fun saveUser(user: User) = dao.insert(user)
}

Пояснение кода:

Код показывает типичный стек для Android: Room + DAO + репозиторий.
@Entity описывает таблицу, @Dao — методы доступа к данным, @Database — точку сборки БД.
Запросы и запись выполняются через suspend-функции, чтобы операции шли вне UI-потока.
Репозиторий скрывает детали хранения и позволяет потом заменить источник данных без изменения бизнес-логики.

Ключевые моменты:

  • Для локальной БД в Android чаще всего используют Room, потому что он безопаснее и удобнее сырого SQLite.
  • SQLiteOpenHelper полезен, когда нужен прямой контроль над SQL и схемой, но это более низкий уровень.
  • Доступ к БД нужно выполнять вне главного потока, обычно через корутины, Flow или другой асинхронный механизм.
  • Репозиторий помогает изолировать приложение от конкретной реализации хранения данных.
  • Для простых настроек и небольших значений лучше использовать DataStore или SharedPreferences, а не полноценную БД.
  • Важно понимать миграции схемы, конфликтные стратегии и необходимость индексов для производительности.