В начала года Google представил новый вариант сохранения взамен SharedPreferences. И я наконец-то решила посмотреть, в чём разница и зачем переходить на новую логику. Всё оказалось достаточно просто и удобно.
Если своими словами, то:
- Все операции выполняются на Dispatchers.IO. Это значит, что мы не блокируем ui и не случится ничего страшного, если мы забудем вынести в другой поток сохранение или получение.
- Теперь у нас никогда не будет ситуаций, что какие-то данные где-то устарели (одна из глобальных проблем в многопоточности). Всегда сначала происходит запись, а потом чтение.
- Возращаем Flow. А это значит, что можно один раз подписаться и больше не думать про то, что надо в какой-то момент самостоятельно обновлять данные. Вот это прям потрясающе и мне сразу же захотелось добавить в проект.
- Есть хорошая миграция. Правда я её пока что не пробовала.
- Благодаря тому, что сама библиотека сделана на корутинах и Flow, есть прекрасная обработка ошибок. Мы можем ловить их через dataStore.data.catch { } и сразу обрабатывать. А при записи можем обернуть в try-catch и ловить IOException. Именно это исключение будет всегда, если что-то пойдёт не так при записи или чтении.
Если не своими словами, то нашла замечательную картинку и статью:
Как подключаем:
- Добавляем зависимость implementation "androidx.datastore:datastore-preferences:1.0.0"
- Создаем класс, который будет отвечать за хранение данных. Обязательно передаём в него контекст.
- Создаем расширение private val Context.dataStore by preferencesDataStore(name = USER_PREFERENCES_NAME), где USER_PREFERENCES_NAME — имя файлика, где всё будем хранить. Выбираем любое имя.
- Создаем константу const val YOUR_KEY = booleanPreferencesKey(KEY_TEXT), где KEY_TEXT — любой, удобный вам текст. booleanPreferencesKey взяла для примера. Там есть stringPreferencesKey и для остальных типов. Выбираем тот, который нам подходит.
- Сохраняем через context.dataStore.edit { it[YOUR_KEY] = YOUR_VALUE }
- Достаём через context.dataStore.data.map { it[YOUR_KEY] }
- Пример, как реализовывала я:
Готово. :)
Дубль статей в телеграмме — https://t.me/android_junior
Мои заметки в телеграмме — https://t.me/android_junior_notes