sqlite 房间线程管理

1szpjjfi  于 2023-05-23  发布在  SQLite
关注(0)|答案(3)|浏览(110)

Android开发者页面说道:
默认情况下,所有查询(@Query)必须在主线程以外的线程上执行。对于插入或删除之类的操作,如果您使用提供的便利注解,Room会为您管理线程。
来源:https://google-developer-training.github.io/android-developer-advanced-course-practical/unit-6-working-with-architecture-components/lesson-14-room,-livedata,-viewmodel/14 - 1-a-room-livedata-viewmodel/14 -1-a-room-livedata-viewmodel.html#task3intro
但这是不正确的,对吗?Room不会在后台线程上自动运行插入和删除操作。那么这句话是什么意思呢?

7ajki6be

7ajki6be1#

这意味着这些房间操作是thread-safe(因此,如果您使用了thread-safe,则不必考虑它)。在不同的后台线程上运行插入/删除操作,source

ao218c7q

ao218c7q2#

默认情况下你不能在主线程上运行房间操作。您可以使用.allowMainThreadQueries()在主线程中运行它们。

if (INSTANCE == null) {
        INSTANCE = Room.databaseBuilder(context.getApplicationContext(), AppDatabase.class, "database")
                .allowMainThreadQueries()
                .build();
    }
    return INSTANCE;

或者您必须创建一个AsyncTask来执行房间查询。
如果你正在使用room运行长时间运行的操作,你应该使用AsyncTask,因为在主UI线程上运行长时间运行的操作可能会导致UI阻塞。

neekobn8

neekobn83#

如果您使用提供的便利注解,Room会为您管理线程。
这意味着,当您在Dao接口中使用这些Room注解时;如果这些修改(更新、插入和删除)在不同的后台线程中运行,则Room会处理这些修改。房间不提供这个背景线程虽然;但是它可以管理来自不同线程的多个请求。
这也可能是因为当使用这样的注解时,这些方法中的每一个都在单独的事务(documentation reference)中运行。数据库事务操作是独立的操作,不会相互影响。
一些数据库系统限制在多个线程中同时使用同一数据库连接;房间没有,房间照顾这一点,因为它的线程安全。

相关问题