我有一个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>
即使您只想要列表,数据库也需要在单独的工作线程上执行操作。您可以使用与
@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.
}
对于无法访问主线程上的数据库-
// Access viewmodel so that it gets initialized on the main thread
itemsViewModel
val list = itemsViewModel.getList()
您是否在使用协程?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没有返回摄像机的意图吗? 谢谢!