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

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

Для хранения реляционных данных используется СУБД 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() удалит файл из черновиков и откатит БД.