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

如何使用Android Room从数据库中获取行?[重复]

巴学潞
2023-03-14

一切正常(使用AsyncTask插入、更新、删除),但按id获取一行不是。。。

主要问题是有两种活动。

  1. 回收视图

我想在点击RecyclerView列表项后,从数据库中按id获取一个项。如果我用LiveData获取它,我就无法将其与UI线程中的变量同步。

如何从数据库中获取一行?

在DAO中,我有:

@Query("SELECT * FROM codes WHERE id = :id")
Code getCodeById(int id);

在存储库中:

public Code retrieveCode(int id){
    return myDatabase.getCodeDao().getCodeById(id);
}

如果我把它写在主线程里

selectedCode = mCodeRepository.retrieveCode(codeId);

它给出了一个错误:

 Caused by: java.lang.IllegalStateException: Cannot access database on the main thread since it may potentially lock the UI for a long period of time.

我应该使用AsyncTask,但如何使用?

共有1个答案

呼延高超
2023-03-14

要解决这个问题,您可以做的事情很少。在本例中,您使用的是java。那么,首先为什么Android要求你不要调用UI线程呢?在android中,每当你启动一个应用程序时,它都会与一个进程关联,并在主线程即UI线程上运行。默认情况下,所有操作都在ui线程上运行。主要是所有涉及UI实例的操作都应该在UI线程上运行。现在,无论何时调用API或调用数据库来检索数据,都可能需要一些时间。所以,如果你在UI线程上运行这个操作,那么可能会发生的事情是,它会阻止所有操作,因为一个重载任务正在进行中,这就是为什么它可能会崩溃,或者给你错误,你不能在主线程上运行它。

要解决这个问题,您可以使用

App.db = Room.databaseBuilder(this, AppDb::class.java,"Your DB Name")
                     .allowMainThreadQueries()
                     .build()

它将允许你调用主线程。这是最简单、最直接的方法。

或者你可以使用异步任务方法。

 类似资料:
  • 问题内容: 我正在尝试创建一个用于在PHP上执行oracle sql语句的类。 这是我的index.php,我正在尝试调用我的函数 和我的dbcontrol.php用于我的功能 我不确定似乎有什么问题。但是每次我运行这个。页面上未显示任何内容。没有结果,没有数据。但是我确信数据库中有数据。 问题答案: 您总是得到空白页的原因是: oci_num_rows()函数不会返回您可能认为的所选行数。它返回

  • 问题内容: 我想知道如何在CodeIgniter中使用AJAX从数据库获取数据。您能否检查下面的代码以找出问题的原因?当我从视图中单击链接时,没有任何反应。 这是我的看法: 这是我的控制器: 这是我的模型: 这是我的JavaScript文件: 问题答案: 试试这个: 我所看到的问题是这是因为您的选择器是锚,并且锚具有文本而不是值。因此,我建议您使用而不是。

  • 问题内容: 我正在尝试创建一个自定义的视图,该视图可以让我获得数据库所有视图和表的行数。 在SQL Server中该死的表计数 现在,我需要获取VIEWS的行数 我觉得唯一的方法是从视图中计算行数,即 但是,我找不到一种方法来让视图的行数以及view_name,table_schema等。 在这方面的任何进步将是有帮助的。 问题答案: 这是最终的解决方案:

  • 问题内容: 这是我的类,用于从数据库中获取数据 这是我的文件: 当我运行该程序时,出现异常后,请帮助我如何解决它。我是Hibernate的新手,尝试学习但被卡住了。 虽然我能够将数据存储在数据库中,但我有2个用于第一和第二类的数据获取数据,但在获取数据时遇到了问题PLZ帮助。 问题答案: 让我引述一下: 据我所知,您正在使用表名。 所以应该是这样的:

  • 我正在创建一个fetchBill函数。分配https://randomapi.com/api/006b08a801d82d0c9824dcfdfdfa3b3c到一个api变量。它使用浏览器的fetch函数向api发出HTTP请求。它在一个函数中使用箭头函数。然后调用fetch函数,并在将其转换为JSON后返回响应。使用另一个。然后调用第一个函数,该函数将JSON数据传递给displayCartTo

  • 我将使用Apache Camel编写一个CRUD应用程序,非常像下面的示例:http://java.dzone.com/articles/rest-apache-camel 但我想使用JPA,而不仅仅是JDBC。 我看过Camel JPA组件,认为我可以使用它。但要从数据库中读取数据,它需要我定义一个消费者endpoint。 我想从JDBC示例中执行以下操作: 即调用JPA组件作为生产者。 这可能