DBflow не работает с существующей базой данных, когда также используется sqlCipher - PullRequest
1 голос
/ 05 апреля 2019

Я успешно использую 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 Ответ

0 голосов
/ 26 июня 2019

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

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

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

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

...