【问题标题】:DBflow does not work with existing Database when also using sqlCipher在使用 sqlCipher 时,DBflow 不适用于现有数据库
【发布时间】:2019-08-26 19:56:35
【问题描述】:

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

【问题讨论】:

    标签: android kotlin dbflow


    【解决方案1】:

    问题竟然与sqlCipher无关!

    这个问题原来与我正在初始化两个数据库的事实有关。

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

    除此之外,我实际上能够继续使用这两个数据库,只需先使用现有值初始化加密数据库,然后初始化空的未加密数据库。

    【讨论】:

      猜你喜欢
      • 2016-10-22
      • 2017-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多