Найти тему

Попробовала Preferences DataStore

В начала года Google представил новый вариант сохранения взамен SharedPreferences. И я наконец-то решила посмотреть, в чём разница и зачем переходить на новую логику. Всё оказалось достаточно просто и удобно.

Если своими словами, то:

  • Все операции выполняются на Dispatchers.IO. Это значит, что мы не блокируем ui и не случится ничего страшного, если мы забудем вынести в другой поток сохранение или получение.
  • Теперь у нас никогда не будет ситуаций, что какие-то данные где-то устарели (одна из глобальных проблем в многопоточности). Всегда сначала происходит запись, а потом чтение.
  • Возращаем Flow. А это значит, что можно один раз подписаться и больше не думать про то, что надо в какой-то момент самостоятельно обновлять данные. Вот это прям потрясающе и мне сразу же захотелось добавить в проект.
  • Есть хорошая миграция. Правда я её пока что не пробовала.
  • Благодаря тому, что сама библиотека сделана на корутинах и Flow, есть прекрасная обработка ошибок. Мы можем ловить их через dataStore.data.catch { } и сразу обрабатывать. А при записи можем обернуть в try-catch и ловить IOException. Именно это исключение будет всегда, если что-то пойдёт не так при записи или чтении.

Если не своими словами, то нашла замечательную картинку и статью:

https://medium.com/androiddevelopers/introduction-to-jetpack-datastore-3dc8d74139e7
https://medium.com/androiddevelopers/introduction-to-jetpack-datastore-3dc8d74139e7

Как подключаем:

  1. Добавляем зависимость implementation "androidx.datastore:datastore-preferences:1.0.0"
  2. Создаем класс, который будет отвечать за хранение данных. Обязательно передаём в него контекст.
  3. Создаем расширение private val Context.dataStore by preferencesDataStore(name = USER_PREFERENCES_NAME), где USER_PREFERENCES_NAME — имя файлика, где всё будем хранить. Выбираем любое имя.
  4. Создаем константу const val YOUR_KEY = booleanPreferencesKey(KEY_TEXT), где KEY_TEXT — любой, удобный вам текст. booleanPreferencesKey взяла для примера. Там есть stringPreferencesKey и для остальных типов. Выбираем тот, который нам подходит.
  5. Сохраняем через context.dataStore.edit { it[YOUR_KEY] = YOUR_VALUE }
  6. Достаём через context.dataStore.data.map { it[YOUR_KEY] }
  7. Пример, как реализовывала я:
https://github.com/Ladgertha/IrregularVerbsApp/blob/develop/datastore-impl/src/main/java/ru/ladgertha/datastore_impl/datastore/IrregularVerbsDatastoreImpl.kt
https://github.com/Ladgertha/IrregularVerbsApp/blob/develop/datastore-impl/src/main/java/ru/ladgertha/datastore_impl/datastore/IrregularVerbsDatastoreImpl.kt

Готово. :)


Дубль статей в телеграмме —
https://t.me/android_junior

Мои заметки в телеграмме — https://t.me/android_junior_notes