Комната (SQLite) и Котлин

Продолжая макет нашего проекта из этого поста, мы собираемся изменить наш источник данных на базу данных SQLite.

Чтобы упростить это, мы будем использовать Room. Библиотека сохраняемости Room обеспечивает уровень абстракции над SQLite.

Чтобы использовать Room в своем приложении, добавьте следующие зависимости в файл build.gradle вашего приложения:

dependencies {
    ....
    kapt "org.xerial:sqlite-jdbc:3.34.0"

    // Room
    def room_version = "2.3.0"
    implementation "androidx.room:room-runtime:$room_version"
    annotationProcessor "androidx.room:room-compiler:$room_version"
    kapt "androidx.room:room-compiler:$room_version"
    implementation "androidx.room:room-ktx:$room_version"
}

Примечание: «sqlite-jdbc», необходимый во время создания этого блога, если вы используете процессор руки, так как вы получите это без него: «Не найдена собственная библиотека для os.name= Mac и os.arch=aarch64”

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

├─Core
├─Presentation
├─Domain
│ ├─Model
│ │ └─ Todo.kt
│ └─Repository
│   └─ TodoRepository.kt
└─Data
  ├─DataSource 
  │ ├─ TodoDataSource.kt
  │ └─Room
  │   ├─ TodoDao.kt
  │   ├─ TodoDatabase.kt
  │   ├─ TodoRoomDataSourceImpl.kt
  │   └─Entity
  │     └─TodoRoomEntity.kt
  └─Repository
    └─TodoRepositoryImpl.kt

Начнем со слоя домена. Это описывает ЧТО делает наше приложение. Итак, мы создадим Todo Entity и TodoRepository.

Далее мы укажем, что должен делать наш источник данных, создав интерфейс TodoDataSource.

Хорошо, теперь давайте реализуем эти детали проекта:

Нам нужны три вещи, чтобы наш код Kotlin мог общаться с нашей БД SQLite:

  1. Сущности данных: классы данных, которые представляют таблицы базы данных.
  2. Объекты доступа к данным (DAO): контейнер методов, которые сопоставляются с SQL-запросами.
  3. Класс базы данных: основная точка доступа для сохранения данных

Начнем с нашего объекта данных. Мы назовем этот объект TodoRoomEntity, так как он представляет собой сущность, относящуюся к комнате. Обратите внимание, как дополнительный код сопоставления TodoRoomEntity с классом данных Todo на уровне предметной области.

Теперь давайте создадим DAO и базу данных.

Чтобы использовать Dao, мы можем создать источник данных, соответствующий TodoDataSource. Мы внедряем DAO как зависимость.

и, наконец, наш TodoRepositoryImpl реализует наш TodoRepository: