Android Room:同步查询返回null

Sie*_*yer 2 android kotlin android-room

我有一个Site和相应的SiteDao

@Dao
interface SiteDao {
    @get:Query("SELECT * FROM site WHERE uid = 1 LIMIT 1")
    val site: LiveData<Site>

    @get:Query("SELECT * FROM site WHERE uid = 1 LIMIT 1")
    val getSiteSync: Site

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    fun insert(context: Site)
}
Run Code Online (Sandbox Code Playgroud)

这有效:

siteRepository.getSite().observe(activity, Observer<Site> {
     // `it` is instance of Site, working as intended
})
Run Code Online (Sandbox Code Playgroud)

这不会:

Thread {
    val site = siteRepository.getSiteSync()
    // site is null
}.start()
Run Code Online (Sandbox Code Playgroud)

没关系,我使用的是Repository而不是ViewModel,只是一个例子。

知道为什么吗?

Ema*_*l S 5

Room 默认不允许同步查询。

为此,您必须在初始化数据库时显式调用allowMainThreadQueries

这是这样设计的,因为数据库选择应该观察变化而不是立即获取。