同时使用sqlCipher时,DBflow无法与现有数据库一起使用

时间:2019-04-04 23:53:17

标签: 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 个答案:

答案 0 :(得分:0)

该问题与sqlCipher无关!

事实证明,该问题与我正在初始化两个数据库有关。

仅通过使用现有值来初始化加密数据库,现在就会出现现有值。

最重要的是,实际上我可以继续使用两个数据库,只需先用现有值初始化加密的数据库,然后再初始化空的未加密数据库。