0Pricing
Android Academy · Урок

DataStore и SharedPreferences

Узнайте, почему DataStore — современный выбор

«DataStore и SharedPreferences» — бесплатный урок Android Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Android Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Android Academy содержит 4 уроков всего.

Хранение небольших настроек

Почти каждому приложению нужно запоминать небольшие фрагменты данных: переключатель тёмной темы, последнюю использованную вкладку, имя пользователя. Это настройки «ключ — значение», а не большие реляционные данные.

Много лет Android использовал для этого SharedPreferences. Сегодня рекомендуемое решение — DataStore.

Что такое SharedPreferences

SharedPreferences — простое хранилище «ключ — значение» на основе XML. Вы получаете редактор, записываете значения и сохраняете их.

  • Простота использования
  • Встроено во фреймворк
  • Синхронный API, который может блокировать поток пользовательского интерфейса
val prefs = context.getSharedPreferences("settings", Context.MODE_PRIVATE)
prefs.edit().putBoolean("dark_mode", true).apply()
val dark = prefs.getBoolean("dark_mode", false)

Проблемы SharedPreferences

У SharedPreferences есть существенные недостатки:

  • Чтение с помощью getX() может блокировать вызывающий поток, часто главный
  • commit() выполняет дисковый ввод-вывод синхронно
  • Нет встроенного способа сообщать об ошибках
  • API не обеспечивает безопасность типов и не является реактивным

Появление DataStore

DataStore — современная замена, построенная на Kotlin coroutines и Flow. Она выполняет всю работу с диском не в главном потоке и предоставляет данные в виде наблюдаемого потока.

Существует два варианта: Preferences DataStore (пары «ключ — значение») и Proto DataStore (типизированные объекты).

Асинхронность заложена в дизайн

DataStore никогда не блокирует пользовательский интерфейс. Чтение выполняется через Flow, который Вы собираете, а записи — через функции suspend, вызываемые из сопрограммы.

Это означает, что чтение и запись настроек безопасны даже в главном потоке, поскольку трудоёмкая работа выполняется в фоновом диспетчере.

val darkMode: Flow<Boolean> = dataStore.data
    .map { prefs -> prefs[DARK_MODE_KEY] ?: false }

Реактивные обновления

Поскольку DataStore предоставляет Flow, пользовательский интерфейс автоматически обновляется при изменении значения. С SharedPreferences приходилось регистрировать неудобный слушатель изменений.

В Jetpack Compose достаточно применить к потоку collectAsState(), и экран будет перекомпоновываться при каждом обновлении.

Транзакционность и согласованность

Записи в DataStore являются транзакционными. Обновление либо полностью выполняется, либо полностью завершается неудачей, поэтому Вы никогда не прочитаете частично записанное значение.

Кроме того, DataStore гарантирует согласованность данных между несколькими операциями чтения и записи в одном процессе.

Обработка ошибок

SharedPreferences без уведомления подавляет проблемы ввода-вывода. DataStore сообщает о них: чтение может передать IOException через поток, а Вы можете обработать её с помощью catch и восстановить работу.

val settings: Flow<Settings> = dataStore.data
    .catch { e ->
        if (e is IOException) emit(emptyPreferences())
        else throw e
    }
    .map { /* map to your model */ }

Когда DataStore не подходит

DataStore предназначена для небольших или средних объёмов данных в формате «ключ — значение» или типизированных данных. Это не база данных.

  • Большие наборы данных, запросы и связи: используйте Room
  • Файлы, изображения и мультимедиа: используйте файловую систему
  • Небольшое количество настроек: используйте DataStore

Добавление зависимости

Чтобы использовать Preferences DataStore, добавьте артефакт в файл Gradle модуля. Для Proto DataStore предусмотрен отдельный артефакт.

dependencies {
    implementation("androidx.datastore:datastore-preferences:1.1.1")
}

Миграция с SharedPreferences

Необязательно переписывать всё сразу. DataStore предоставляет SharedPreferencesMigration, который автоматически копирует существующие значения при первом чтении.

val Context.dataStore by preferencesDataStore(
    name = "settings",
    produceMigrations = { context ->
        listOf(SharedPreferencesMigration(context, "settings"))
    }
)

Быстрая проверка

Проверьте, насколько хорошо Вы понимаете, почему предпочтительно использовать DataStore.

Итоги

Вы узнали, почему DataStore — современный выбор для настроек в формате «ключ—значение»:

  • SharedPreferences может блокировать главный поток и не поддерживает реактивность
  • DataStore использует корутины и Flow для безопасного асинхронного доступа
  • Записи выполняются транзакционно с корректной обработкой ошибок
  • Существуют два варианта: Preferences и Proto

Далее Вы на практике воспользуетесь делегатом preferencesDataStore.

Часто задаваемые вопросы

Урок «DataStore и SharedPreferences» бесплатный?

Да — полный текст урока «DataStore и SharedPreferences» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Android Academy, подпишись на CoddyKit PRO. Курс Android Academy содержит 4 уроков всего.

Чему я научусь в уроке «DataStore и SharedPreferences»?

Узнайте, почему DataStore — современный выбор Ты практикуешь Android Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Android Academy?

Предыдущий опыт не требуется. Android Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.

Сколько времени занимает урок «DataStore и SharedPreferences»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Android Academy?

Да. Каждый урок Android Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

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

  1. DataStore и SharedPreferences
  2. DataStore для настроек
  3. Чтение и запись настроек
  4. Proto DataStore
← Назад к Android Academy