0Pricing
Android Academy · Урок

Proto DataStore

Храните типизированные структурированные данные

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

Proto DataStore

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

Этот вариант особенно удобен, когда настройки образуют согласованную модель.

Зачем нужны типизированные данные

Preferences DataStore не типизирован: опечатка в ключе или чтение значения неправильного типа обнаруживаются только во время выполнения. Proto DataStore обеспечивает проверку типов во время компиляции для всего объекта настроек.

  • Нет строковых ключей, в которых можно допустить опечатку
  • Значения по умолчанию определяются в схеме
  • Поля удобно рефакторить

Выбор формата сериализатора

Классический подход использует Protocol Buffers (proto) для определения схемы. Также можно выполнять сериализацию с помощью kotlinx.serialization или любого собственного формата. Схема описывает поля и типы.

Определение схемы Proto

Создайте файл .proto, описывающий сообщение с настройками. Компилятор protobuf сгенерирует на его основе класс Kotlin/Java.

syntax = "proto3";

option java_package = "com.example.app";
option java_multiple_files = true;

message UserSettings {
  bool dark_mode = 1;
  int32 font_size = 2;
  string username = 3;
}

Реализация сериализатора

DataStore нужен Serializer, который умеет читать Ваш тип из потока и записывать его в поток, а также defaultValue, используемое, когда файл пуст.

object UserSettingsSerializer : Serializer<UserSettings> {
    override val defaultValue: UserSettings = UserSettings.getDefaultInstance()

    override suspend fun readFrom(input: InputStream): UserSettings =
        UserSettings.parseFrom(input)

    override suspend fun writeTo(t: UserSettings, output: OutputStream) =
        t.writeTo(output)
}

Создание Proto DataStore

Используйте делегат dataStore (не preferencesDataStore), передав ему имя файла и Ваш сериализатор.

val Context.settingsStore: DataStore<UserSettings> by dataStore(
    fileName = "user_settings.pb",
    serializer = UserSettingsSerializer
)

Чтение типизированных данных

Чтение выполняется через settingsStore.data, но теперь тип потока — Ваша модель. Ключи и приведение типов не нужны: просто обращайтесь к полям напрямую.

val darkMode: Flow<Boolean> = context.settingsStore.data
    .map { settings -> settings.darkMode }

Запись с помощью updateData

Proto DataStore заменяет edit на приостанавливаемую функцию updateData. Вы получаете текущий объект и возвращаете новый. При работе с protobuf используется сгенерированный строитель.

suspend fun setDarkMode(enabled: Boolean) {
    context.settingsStore.updateData { current ->
        current.toBuilder()
            .setDarkMode(enabled)
            .build()
    }
}

Неизменяемые обновления

Обратите внимание: существующий объект никогда не изменяется. Вы создаёте и возвращаете новый объект. Именно неизменяемость делает обновления транзакционными и согласованными для всех наблюдателей.

Обработка повреждений

Если сохранённый файл становится нечитаемым, DataStore выбрасывает CorruptionException. Можно передать corruptionHandler, который вернёт безопасное значение по умолчанию вместо аварийного завершения.

val Context.settingsStore by dataStore(
    fileName = "user_settings.pb",
    serializer = UserSettingsSerializer,
    corruptionHandler = ReplaceFileCorruptionHandler {
        UserSettings.getDefaultInstance()
    }
)

Preferences и Proto

Выбирайте вариант в зависимости от Ваших задач:

  • Preferences: несколько несвязанных флагов, быстрая настройка, отсутствие схемы
  • Proto: структурированная модель настроек, строгая типизация, заданные значения по умолчанию

Оба варианта используют общую асинхронную транзакционную основу на базе Flow.

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

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

Итоги

Вы научились хранить типизированные данные с помощью Proto DataStore:

  • Определять схему, часто с помощью Protocol Buffers
  • Реализовывать Serializer с defaultValue
  • Создавать хранилище с помощью делегата dataStore
  • Напрямую читать поля и записывать данные с помощью updateData
  • Обрабатывать повреждения с помощью обработчика, возвращающего значение по умолчанию

Вы завершили курс по DataStore.

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

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

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

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

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

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

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

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

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

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

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

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

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