Android Room 中的@Transaction 似乎没有按预期工作

问题描述 投票:0回答:1

在下面的代码中,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 {} 不能解决这个问题..

android android-room kotlin-flow
1个回答
0
投票

@Query("")
函数添加
refreshInboxMessages
注释。

我相信,这解决了 Room 不将函数视为执行 SQL 的问题,因此没有为函数添加事务处理。

© www.soinside.com 2019 - 2024. All rights reserved.