DBFlow не работает с существующей базой данных при использовании SQLCipher

#android #kotlin #dbflow

#Android #kotlin #dbflow

Вопрос:

Я уже некоторое время успешно использую Dbflow. За прошедший месяц мое приложение нормально работало с одной базой данных SQLCipher, которая загружена без существующих значений в своей таблице, а вторая база данных представляет собой обычную таблицу sqlite, которая загружена с существующими строками в паре своих таблиц. С помощью этой простой базы данных sqlite я сразу могу определить, что эти записи находятся в таблицах, в которых они должны быть, посмотрев на размер базы данных в проводнике файлов устройства, а также запросив значения в коде.

Моя проблема в том, что мне нужно было переместить эти существующие таблицы из обычной базы данных sqlite в базу данных SQLCipher. Это когда база данных sqlcipher перестает работать так, как я ожидаю. Теперь после загрузки баз данных нет никаких признаков этих записей. Это как если бы база данных SQLCipher (и таблицы) создавалась с нуля на основе ORM, а фактически не с использованием предоставленной существующей базы данных SQLCipher.

Вот как я настраиваю функционирующую обычную базу данных sqlite и базу данных SQLCipher, которая не работает:

Конфигурация для простой базы данных sqlite, которая работает:

Имя существующего файла базы данных ‘normalDb.db’ и находится в папке ресурсов

Инициализирующий код:

 val normalDbConfig = FlowConfig.Builder(this)
                .database(
                        DatabaseConfig.builder(normalDb::class, AndroidSQLiteOpenHelper.createHelperCreator(this))
                                .databaseName("normalDb")
                                .build())
                .openDatabasesOnInit(true)
                .build()

        FlowManager.init(normalDbConfig)
  

Объявление базы данных:

 @Database(version = normalDb.VERSION)
abstract class normalDb : DBFlowDatabase(){
    companion object {
        const val VERSION = 1
    }
}

  

Конфигурация для базы данных SQLCipher, которая, похоже, не загружает существующие таблицы:

Имя существующего файла базы данных ‘encryptedDb.db’ и находится в папке ресурсов

Инициализирующий код:

 val encryptedDbConfig = FlowConfig.Builder(this)
                .database(
                        DatabaseConfig.Builder(encryptedDb::class) { db, callback -> SQLCipherHelper(this, db, callback) }
                                .databaseName("encryptedDb")
                            .build())
                .build()

        FlowManager.init(encryptedDbConfig)
  

Объявление базы данных:

 @Database(version = encryptedDb.VERSION)
abstract class encryptedDb : DBFlowDatabase(){
    companion object {
        const val VERSION = 1
    }
}
  

Помощник SQLCipher:

 class SQLCipherHelper(context: Context,
                              databaseDefinition: DBFlowDatabase,
                              callback: DatabaseCallback?)
    : SQLCipherOpenHelper(context, databaseDefinition, callback) {
    override val cipherSecret get() = "myPassword"
}
  

Также обратите внимание, что приведенный выше код для зашифрованной базы данных компилируется и запускается, и я вижу, что он создан на устройстве, заглянув в проводник файлов Android. Я также могу добавлять новые записи, а затем запрашивать их, они также будут сохраняться при выполнении, пока я не удалю файлы базы данных на устройстве (иначе функционирующие должным образом). Ожидалось). Отсутствуют только начальные строки, находящиеся в файле .db, который я указал в качестве существующей базы данных.

Ответ №1:

Проблема оказалась не связанной с SQLCipher!

Проблема оказалась связанной с тем фактом, что я инициализировал две базы данных.

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

Кроме того, я фактически смог продолжить использование обеих баз данных, просто инициализировав зашифрованную базу данных сначала существующими значениями, а затем инициализировав пустую незашифрованную базу данных.