Android Room:同步查询返回null

5
我有一个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)
}

这样做可以起作用:
siteRepository.getSite().observe(activity, Observer<Site> {
     // `it` is instance of Site, working as intended
})

这个不行:
Thread {
    val site = siteRepository.getSiteSync()
    // site is null
}.start()

不用在意我使用的是Repository而不是ViewModel,这只是一个例子。

你有什么想法吗?

1个回答

7

默认情况下,Room不允许同步查询。

如果要实现同步查询,则需要在初始化数据库时显式调用allowMainThreadQueries

之所以这样设计,是因为数据库选择应该监视更改并且不能立即获取。


我在理解Room时遇到了问题,因为并非所有数据库中的数据都会更改,我发现每次想要获取数据库时需要再次创建AsyncTask并不简单,我有点失望这个新组件最终没有变得那么容易使用。 - David
1
@David 他们真的希望你使用LiveData或RxJava。这样,你就可以在视图或其他任何可能需要它的地方始终拥有最新的数据,非常简单。应该避免手动重新查询,如果必要的话,请考虑使用LiveData。 - LuLeBe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接