如何检测SQLite Android中的打开/关闭连接更改?

How to detect open/close connection change in SQLite Android?

提问人:Captain Jacky 提问时间:6/28/2023 更新时间:6/28/2023 访问量:31

问:

有没有办法检测SQLite连接何时关闭?我正在尝试集成SQLCipher,这是初始化方法:

fun initialize(passphrase: String): Boolean {
    this.passphrase = SQLiteDatabase.getBytes(passphrase.toCharArray())
    this.factory = SupportFactory(this.passphrase, PasswordValidationHook(), false)

    return try {
        myDatabase = Room.databaseBuilder(
            context.applicationContext,
            MyDatabase::class.java,
            DATABASE_NAME
        )
            .openHelperFactory(factory)
            .build()

        myDatabase.query("SELECT 1", emptyArray())

        true
    } catch (e: Exception) {
        false
    }
}

现在,如果连接被打开,我知道在行之后.但是,我找不到合适的方法来检测数据库何时关闭连接,因为我有一个通知服务,可以显示数据库是否打开。myDatabase.query("SELECT 1", emptyArray())

我可以手动关闭方法上的连接并附加一个侦听器,但是,不建议这样做,因为此方法并不总是被调用。onDestroy

Android SQLITE kotlin sqlcipher

评论


答:

0赞 Gabe Sechan 6/28/2023 #1

SQLite中没有连接。这不是一个传统的数据库,它是另一个过程。它是一个库,它确实在当前正在运行的进程中直接执行文件 IO。因此没有连接,没有IPC到另一个进程,也没有关闭或打开连接。那里的帮助者“打开”DATABASE_NAME它只是告诉它要为该对象使用哪个数据库文件

评论

0赞 Captain Jacky 6/28/2023
谢谢你的回答。但是连接仍然可以称为在我的应用程序进程中打开我的数据库文件的行为?我还可以调用我的数据库对象无效的函数。有没有办法检测此 DB 文件何时变得无效,无法通过触发器读取或以任何方式在我的 Service 类中读取?因为我不知道数据库何时会调用 close()。谢谢。setAutoCloseTimeout()close()
0赞 Gabe Sechan 6/28/2023
是什么让你认为它曾经被关闭?或者它在每次读/写后都没有关闭?所有这些都是您不应依赖的特定版本的库的实现细节。由于没有与外部进程的连接,因此考虑闭合连接的概念没有任何价值。如果你正在做一些非常古怪的事情,比如完全删除数据库文件,你需要关闭打开的文件句柄,那么关闭就在那里。你通常不会使用它。