Android SQLite恢复后“无此类表:room_table_modification_log”

Android SQLite "no such table: room_table_modification_log" after restore

提问人:Captain Jacky 提问时间:7/12/2023 更新时间:7/12/2023 访问量:60

问:

我正在尝试基于(https://github.com/sqlcipher/android-database-sqlcipher)实现数据库,但是在我恢复数据库并尝试对其执行任何操作后,出现以下错误:SQLiteSQLCipher

Cannot run invalidation tracker. Is the db closed?

android.database.sqlite.SQLiteException: no such table: room_table_modification_log: , 
while compiling: SELECT * FROM room_table_modification_log WHERE invalidated = 1;

如果我从最近的应用程序中关闭应用程序并再次打开该应用程序,则不会引发任何错误。

我使用以下命令初始化我的数据库:

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

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

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

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

然后,当用户按下还原数据库时,他选择文件,然后调用以下方法来还原数据库:

fun restoreDatabase(backupFilePath: Uri, passphrase: String = "a"): Boolean {
    return try {
        db.close()

        val dbFile = context.getDatabasePath(DATABASE_NAME)
        val file = createTempDatabaseFile(backupFilePath) ?: return false
        file.copyTo(dbFile, overwrite = true)

        return initialize("a")
    } catch (e: Exception) {
        e.printStackTrace()
        false
    }
}

附言:

  1. 我尝试不关闭数据库,但这样内容就不会改变。
  2. 只有当我从最近关闭应用程序并再次重新打开它时,才会抛出错误。重新启动活动无济于事:
val intent = Intent(context, MainActivity::class.java)
(context as MainActivity).finish()
context.startActivity(intent)

截至目前,我使用的库版本:

房间 = “2.6.0-alpha01”

sqlcipher = “4.5.4”

android sqlite kotlin android-room sqlcipher

评论

0赞 rminaj 10/10/2023
我有同样的问题,但我认为我使用的是旧版本的 Room

答: 暂无答案