android 如何在Room中附加数据库?

iovurdzv  于 2023-05-12  发布在  Android
关注(0)|答案(2)|浏览(155)

我尝试在Android Room中附加数据库,如下所示:How to select from multiple databases in Android Room(How to attach databases)但是我在构建项目时出错:**错误:查询有问题:[SQLITE_ERROR] SQL错误或缺少数据库(没有这样的表:database.table)**错误问题

@Query("select t.id as tid from mydatabase.mytable t")
public List<MyPojo> getMyTableIds();

当我添加@SkipQueryVerification时,错误更改为:错误:不知道如何将Cursor转换为该方法的返回类型。
当我从Query中删除“mydatabase.”时,错误消失。
如何在Android Room中附加数据库并进行跨数据库查询?

cgyqldqp

cgyqldqp1#

在我的例子中,我从Firebase下载了一个包含一些数据的database.db文件,并与本地数据库合并
只要记住,如果执行ATTACH语句,ROOM将禁用Write-Ahead Logging(WAL)。因此,如果经常使用ATTACH语句,可以在创建数据库时禁用WAL。
在我的例子中,我只使用了一次ATTACH语句来用最新的值更新数据库。所以,我在交易后重新启用WAL。

private fun mergeDatabases(updateDatabase: File) {
    // database is the room database
    val openDatabase = database.openHelper.writableDatabase
    
    openDatabase.execSQL("ATTACH DATABASE '${updateDatabase.absolutePath}' AS 'merged_database'")

    database.runInTransaction {           
        // PERFORM YOU OPERATIONS
    }
    
    openDatabase.execSQL("DETACH DATABASE 'merged_database'")
    
    // During attach, Write-Ahead Logging is disabled. 
    // So, if you want to enable again, you can do it as follows
    // In my case, I enabled it again because I run attach statement only once
    openDatabase.enableWriteAheadLogging() 
}
j0pj023g

j0pj023g2#

您可以在onOpen回调中附加其他数据库。有关详细信息,请参阅另一篇文章here的答案。

相关问题