Android 房间:同步查询 return null
Android Room: Synchronous queries return null
我有一个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,只是一个例子。
知道为什么吗?
房间默认不允许同步查询。
要实现这一点,您必须在初始化数据库时显式调用 allowMainThreadQueries。
之所以这样设计,是因为数据库选择应该观察变化,而不是立即获取。
我有一个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,只是一个例子。
知道为什么吗?
房间默认不允许同步查询。
要实现这一点,您必须在初始化数据库时显式调用 allowMainThreadQueries。
之所以这样设计,是因为数据库选择应该观察变化,而不是立即获取。