提问人:Captain Jacky 提问时间:7/12/2023 更新时间:7/12/2023 访问量:60
Android SQLite恢复后“无此类表:room_table_modification_log”
Android SQLite "no such table: room_table_modification_log" after restore
问:
我正在尝试基于(https://github.com/sqlcipher/android-database-sqlcipher)实现数据库,但是在我恢复数据库并尝试对其执行任何操作后,出现以下错误:SQLite
SQLCipher
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
}
}
附言:
- 我尝试不关闭数据库,但这样内容就不会改变。
- 只有当我从最近关闭应用程序并再次重新打开它时,才会抛出错误。重新启动活动无济于事:
val intent = Intent(context, MainActivity::class.java)
(context as MainActivity).finish()
context.startActivity(intent)
截至目前,我使用的库版本:
房间 = “2.6.0-alpha01”
sqlcipher = “4.5.4”
答: 暂无答案
评论