Андроид-приложение, 52-я неделя

Практическая работа на прото-датастор

Я бросил выполнять практическую работу: я застрял и не знаю, как делать дальше...

Подготовка к использованию датастора

Повторю здесь список действий, который я публиковал на сорок девятой неделе, так как мне нужно будет кое в чём исправиться.

Подключение библиотек к проекту

В файл «бильд . грейдль . кей-ти-эс» (build.gradle.kts) добавляю строки внутрь существующего блока «депе́нденсис»:

dependencies {
    val lifecycle_version = "2.7.0"
    ...
    // ViewModel
    implementation("androidx.lifecycle-viewmodel-ktx:$lifecycle_version")
    // ViewModel utilities for Compose
    implementation("androidx.lifecycle-viewmodel-compose:$lifecycle_version")
    // Proto DataStore
    implementation("androidx.datastore:datastore:1.0.0")
}

Обратите внимание: последнюю строку с прошлого раза я заменил — и там, и тут.

Создание контейнера приложения

Создаю класс контейнера приложения в пакете приложения. Контейнер приложения должен будет стать контейнером и для датастора (нужно проверить, так ли это!)

package com.example.myapp

import android.app.Application

class AppContainer: Application() {
    override fun onCreate() {
        super.onCreate()
    }
}

Правка манифеста приложения

Чтобы содержимое контейнера было доступно работающему приложению, запуск приложения должен происходить по-другому: как — описано в «манифесте приложения»:

...application
    android:name=".AppContainer"

Теперь точка входа — объект класса «Апп контейнер» (AppContainer). (Это тоже надо проверить...)

Создание схемы данных для прото-датастора

Старый класс «Экза́мпл» (Example, «Пример») я переименовываю как-нибудь.

По пути «СРЦ / мэйн / про́то» (src/main/proto) создаю файл со следующим содержимым:

syntax = "proto3";

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

message Example {
  string id = 1;
  string text = 2;
}

Автогенерация ява-кода по схеме данных

Устанавливаю плагин.

В файл «бильд . грейдль . кей-ти-эс» (build.gradle.kts), в соответствующие места добавляю текст, который ещё нужно проверить на корректность:

plugins {
    ...
    id("com.google.protobuf") version "0.9.4"
}
...
dependencies {
    ...
    // Protobuf
    implementation("com.google.protobuf:protobuf-javalite:3.25.3")
}
...
protobuf {
    protoc {
        artifact = "com.google.protobuf:protoc:3.25.3"
    }
    generateProtoTasks {
        ofSourceSet("main").forEach { task ->
            task.builtins {
                getByName("java") {
                    option("lite")
                }
            }
        }
    }
}

Если мне удастся пересобрать проект, я смогу использовать такой импорт:

import com.example.myapp.datastore.Example

Создание сериализатора

Объект-синглтон «Сериализатор» должен будет обеспечивать автоматическое сохранение структур данных оперативной памяти в формат «сырых данных», помещаемых в файл-хранилище датастора, и обратный процесс, десериализацию. Вот как я определяю такой объект:

package com.example.myapp
...
import androidx.datastore.core.Serializer
import com.example.myapp.datastore.Example
...
object ExampleSerializer : SerializerOfExample {
    ...
}

Заметьте, что SerializerOfExample («Сериала́йзер оф экза́мпл») — это Serializer<Example>.

В планах: лексический поиск

Заметил: словарь «Нэйвера» «не находит» слово 입맛 по запросу 임맏, хотя соответствующая транскрипция в словарной статье есть. Вместо этого правильное слово появляется в поисковой подсказке, под полем ввода запроса.

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