当前位置: 首页 > 知识库问答 >
问题:

android 房间查询方法返回列表,但被错误地视为实时数据

姜杜吟
2023-03-14

我有一个DAO,我在其中查询对象,一些是liveData,大多数是常规函数。但今天我陷入了一个错误循环。如果我访问主线程中的对象,它会给出<code>无法访问主线程上的数据库的错误,因为它可能会长时间锁定UI 但当在IO线程上使用时,它会给出另一个错误:在没有主线程的情况下无法添加观察者。第二个错误很奇怪,因为它不应该是观察者,而是来自查询的简单列表对象。

DAO代码:

@Dao
interface ItemsDAO {

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    ...

    @Delete
    ...

    @Query("SELECT * FROM table_items ORDER BY timestamp")
    fun getAllItems(): LiveData<List<Item>>

    @Query("SELECT * FROM table_items")
    fun allItemsList(): List<Item>

}

在存储库上:

fun getAllItems() =  ItemsDAO.getAllItems()
fun allItemsList() = ItemsDAO.allItemsList()

视图模型:

val getItems = itemPoolRepository.getAllItems()
val allItemsList  = itemPoolRepository.allItemsList()
//also checked same result with the following:
//fun allPoolsItemsList()  = itemPoolRepository.allItemsList() // Gives error : Method addObserver must be called on the main thread

片段:

    val itemsList = itemsViewModel.allItemsList // the error occurrs here
    //val itemsList = itemsViewModel.allItemsList()

如果是在主线程中,我会得到< code > Java . lang . illegalstateexception:无法访问主线程上的数据库,因为它可能会长时间锁定UI。如果在IO线程中,我得到:< code > Java . lang . illegalstateexception:必须在主线程上调用addObserver方法。

它是一个简单的列表,为什么它被视为观察者?我有其他类似的方法来访问查询列表,类似于使用方法参数的方式,这些方法在IO线程上运行良好。有人能告诉我任何解决方案只是为了在任何线程上访问列表吗?

使现代化我添加了暂停,但这并没有解决任何问题,它仍然认为我添加了观察者。

@Query("SELECT * FROM table_items")
suspend fun allItemsList(): List<Item>

共有3个答案

陶智
2023-03-14

即使您只想要列表,数据库也需要在单独的工作线程上执行操作。您可以使用与

@Query("SELECT * FROM table_items ORDER BY timestamp")
fun getAllItems(): LiveData<List<Item>>

替换

@Query("SELECT * FROM table_items")
fun allItemsList(): List<Item>

具有

 @Query("SELECT * FROM table_items")
 fun allItemsList(): LiveData<List<Item>>

每当我们将返回值封装到一个可观察的房间数据库中时,确保查询在后台线程上运行。

现在,在片段中,添加可观察性以查找最新更改

    // The onChanged() method fires when the observed data changes and the activity is
    // in the foreground.
    itemsViewModel.allItemsList.observe(owner = viewLifecycleOwner) { items ->
        // Do something with the data.
      
    }
谭坚诚
2023-03-14

对于无法访问主线程上的数据库-

// Access viewmodel so that it gets initialized on the main thread
itemsViewModel
val list = itemsViewModel.getList()
邴墨竹
2023-03-14

您是否在使用协程?DAO 内部的方法

 类似资料:
  • 在我的Android项目中,我使用Room库来处理SQLite数据库。我使用我的数据库来保存国家电话代码。我的数据库预加载了两个国家(watch大众数据库与国家代码(道:电话代码道)功能); 国家代码实体 DAO接口 在我的应用程序中,我按顺序选择国家代码(观察函数selectCountryCodeByOrder(order:Int):Int)。我在异步{}协同例程中异步调用此函数。但我有一个相当

  • 我正在实现房间数据库。这是我的POJO类 这是DAO类 在运行我的代码时,我收到以下错误

  • 本文向大家介绍Node.js 发生错误时返回查询,包括了Node.js 发生错误时返回查询的使用技巧和注意事项,需要的朋友参考一下 示例 err发生错误时,可以将执行的查询附加到对象上:            

  • 我是新来的和我试图我的得到一个从它。我试图这样做的它与这是id但问题是我不知道如何返回目标从。 这就是<代码>刀 这是Repository类

  • 问题内容: 当我尝试运行以下查询时出现错误: 是什么导致此错误? 问题答案: 将一个返回多列的子查询放在列表中,然后从中选择。 首先,相关子查询将是一个坏主意。但是,您的查询甚至没有关联,但是 没有关联 (没有链接到外部查询),并且似乎返回了多行。这导致产生笛卡尔积的(可能非常昂贵且荒谬的)交叉连接,可能不是您的(秘密)意图。 看起来您确实想要: 两者也都是毫无意义的。WHERE条件将一个强制为a

  • 设备:Emulator pixel 3a-Android11 代码: 使用时: listCam大小为0 当切换到: listCam大小是1-因为它应该是。 使用以下代码: 工作正常,并显示相机应用程序。 你知道为什么queryIntentActivities没有返回摄像机的意图吗? 谢谢!