Я успешно использую 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, которые я указал в качестве существующей базы данных.