#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!
Проблема оказалась связанной с тем фактом, что я инициализировал две базы данных.
При простой инициализации зашифрованной базы данных только существующими значениями теперь отображаются существующие значения.
Кроме того, я фактически смог продолжить использование обеих баз данных, просто инициализировав зашифрованную базу данных сначала существующими значениями, а затем инициализировав пустую незашифрованную базу данных.