在下面的代码中,Flow 似乎是在 deleteAll 和 insertAll 之间发出的。我希望将这些方法作为事务一起执行。我是不是错过了什么?
private const val RECENT_UPDATE_THRESHOLD_MS = 60_000L
@Dao
interface InboxMessageDao {
@Query(
"SELECT * FROM inbox_message " +
"WHERE toEmail == (SELECT email FROM email_address WHERE isCurrent = 1) " +
"AND (strftime('%s', 'now') * 1000 - cacheLastUpdate) < $RECENT_UPDATE_THRESHOLD_MS"
)
fun getAllFlow(): Flow<List<InboxMessageEntity>>
@Insert
suspend fun insertAll(messages: List<InboxMessageEntity>)
@Query("DELETE FROM inbox_message")
suspend fun deleteAll()
@Query("SELECT cacheLastUpdate FROM inbox_message WHERE toEmail == :toEmail LIMIT 1")
suspend fun getCacheLastUpdate(toEmail: String): Long?
@Transaction // TODO: This fails tests sometimes, why?
suspend fun refreshInboxMessages(newMessages: List<InboxMessageEntity>) {
deleteAll()
// Flow seems to be propagated here giving me sometimes empty list in androidTests
insertAll(newMessages)
}
}
我希望在执行整个交易后发出 Flow。
PS。 runInTransaction {} 不能解决这个问题..
为
@Query("")
函数添加 refreshInboxMessages
注释。
我相信,这解决了 Room 不将函数视为执行 SQL 的问题,因此没有为函数添加事务处理。