Источник: Nuances of Programming
Что такое DataStore
На протяжении многих лет разработчики Android хранили небольшие фрагменты конфиденциальных пользовательских данных с помощью общих настроек (shared preferences). Этот подход имеет следующие недостатки:
- Конфиденциальные данные в общих настройках могут быть легко раскрыты.
- Кажется, что вызывать операции с общими настройками в потоке UI безопасно, но это не так (из-за синхронного API, отсутствия механизма сигнализации ошибок, нехватки транзакционного API и т.д.).
DataStore — это библиотека из семейства Jetpack, которая предоставляет новое решение для хранения данных. Скорее всего, оно заменит общие настройки. В настоящее время библиотека находится в альфа-стадии.
Какие подходы она предлагает
Библиотека разработана с использованием корутин Kotlin и Flow API, что делает её более безопасной и надежной, чем общие настройки. Предлагаются два различных подхода к хранению данных:
- Preferences DataStore. Они похожи на SharedPreferences , поскольку не могут определить схему или обеспечить доступ к ключам с правильным типом.
- Proto DataStore. С ее помощью можно создавать схемы, используя буферы протокола , которые позволяют сохранять строго типизированные данные. Они быстрее, меньше, проще и менее неоднозначны, чем XML и другие подобные форматы данных.
Кроме того, при хранении пар ключ-значение будут доступны только ключи, а не само содержимое.
DataStore при работе с базами данных
DataStore предназначена для хранения небольших наборов данных. Если в ваши требования входит частичное обновление, ссылочная целостность или поддержка больших и сложных наборов данных, стоит рассмотреть использование Room .
Интеграция DataStore
Чтобы использовать библиотеку Jetpack DataStore, добавьте строку под узлом dependencies в файле build.gradle уровня app.
implementation "androidx .datastore :datastore-preferences :1.0.0-alpha01"
Использование библиотеки на примере
Чтобы лучше понять, как использовать DataStore, я взял простой пример в реальном времени, где мы храним целое число, указывающее статус входа пользователя. Здесь у нас есть класс enum со всеми возможными этапами:
enum class UserStatus {
STARTER, ONBOARDING_LEVEL_1, ONBOARDING_LEVEL_2, VERIFIED
}
Создание DataStore
Следующим шагом является создание DataStore. Для этого нужно создать класс Kotlin, в котором мы будем использовать функцию расширения context.createDataStore :
class PreferenceManager(context: Context){
private val dataStore = context.createDataStore(name = "prefernce_name" )
}
Создание ключей
Создадим встроенную функцию preferencesKey , определив тип результата:
companion object {
val USER_STATUS = preferencesKey<Int>("user_status" )
}
Сохранение и извлечение данных
Теперь, когда мы создали DataStore и ключи, пришло время сохранить статус пользователя. Сохраним целое число со значениями 1, 2, 3 и 4, представляющими STARTER , ONBOARDING_LEVEL_1 , ONBOARDING_LEVEL_2 и VERIFIED .
Чтобы сохранить пары ключ-значение в файле DataStore, воспользуемся функцией edit , которая обновляет значения и suspend для их сохранения:
Чтобы извлечь значения из DataStore, мы используем Flow API. Одно из главных преимуществ этого подхода в том, что каждый раз, когда в DataStore обновляется значение, мы получаем уведомление. Таким образом, проверять обновленные значения не потребуется.
Вместо того, чтобы передавать целое число в регистр состояния пользователя на сайте вызова, можно использовать такие функции, как map , для преобразования данных в соответствующий тип. Соберем все воедино:
Создание доступа из компонентов Android
Теперь, когда мы закончили с менеджером настроек, разберемся, как вызвать setUserStatus из активности Android:
Поскольку setUserStatus — это функция приостановки, для запуска сопрограммы мы использовали lifecycleScope .
Извлечение данных из центра обработки аналогично: здесь мы применяем collectLatest из Flow API, деформируя его с помощью lifecycleScope :
Читайте также:
Перевод статьи Siva Ganesh Kantamani : Jetpack DataStore: Improved Data-Storage System