我已经成功使用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 文件中的初始行。