Перейти к основному содержанию
`Ctrl`+`K`

# Хранение данных

## Реляционные данные

Для хранения реляционных данных используется СУБД `SQLite` и ORM `Room`.

Для подключения базы данных необходимо:

1. Подключить зависимости в Gradle.

2. Создать класс базы данных.

3. Зарегистрировать базу данных в `MainActivity`.
   В случае, если `MainActivity` унаследована от `GsBaseActivity`, добавьте в класс:

       override fun provideDatabase(): PrototypeDatabase =
           RoomDbSingleton.getInstance(this, "PrototypeDatabase")

### Класс базы данных

    // db/AppDatabase.kt

    @Database(
        entities = [SystemEntity::class, User::class],
        version = 1,
        exportSchema = false
    )
    abstract class AppDatabase : RoomDatabase() {
        abstract val userDao: UserDao

        companion object {
            @Volatile private var INSTANCE: AppDatabase? = null

            fun getInstance(ctx: Context): AppDatabase =
                INSTANCE ?: synchronized(this) {
                    INSTANCE ?: Room.databaseBuilder(
                        ctx,
                        AppDatabase::class.java,
                        "AppDB"
                    ).build().also { INSTANCE = it }
                }
        }
    }

## Файлы

Файлы сохраняются в каталоге приложения согласно настройке `DbConfig.dataPath`.

Для работы с файлами используется `FileManager` в `GsSession`.
Он позволяет организовать транзакционную работу с файлами.

Принципы работы:

- любые загруженные/созданные файлы сначала пишутся во временную область;

- при `commit()` — перемещаются в постоянную область;

- при `rollback()` — удаляются.

Таким образом БД и файлы остаются синхронными.

### Работа с файлами

    val localPath = takePhoto()                          // /cache/…
    val draft     = dbs.fileManager.copyToSendDir(localPath)

    gate.upload(draft)                                   // сервер принял → HTTP 200
    dbs.commit()                                         // файл переносится в /data/

Если сеть упала — вызов `rollback()` удалит файл из черновиков и откатит БД.