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 — локальная установка не требуется.
Все уроки этого курса
- DataStore и SharedPreferences
- DataStore для настроек
- Чтение и запись настроек
- Proto DataStore