11

在官方应用程序架构指南中是存储库的一个例子。检查数据库中是否存在对象以及是否新鲜:

// check if user was fetched recently
boolean userExists = userDao.hasUser(FRESH_TIMEOUT);

任何想法如何为 DAO 实现该功能(hasUser)?

4

3 回答 3

7

大多数架构组件示例都可以在此处获得。在您的情况下,我找不到 UserDao 类,但这里有一个数据库模式示例users表有一last_update列。所以你可以这样写 UserDao :

@Query("SELECT COUNT(*) FROM users WHERE userId == :userId AND last_update >= :timeout)
int hasUser(int userId, long timeout)

如果具有 id 的用户userId不够新鲜,则返回 0。

于 2018-06-18T12:33:53.507 回答
1

您应该在表格中添加一个额外的字段,例如COLUMN_LAST_FETCHED日期,并且在每次询问后,使用时间戳更新该字段。

于 2018-06-18T12:16:06.753 回答
0

考虑使用android-architecture-components GitHub项目RateLimiter所示的类检查数据是否最近被获取:

@Singleton 
@OpenForTesting 
class RepoRepository @Inject constructor(
    private val appExecutors: AppExecutors,
    private val db: GithubDb,
    private val repoDao: RepoDao,
    private val githubService: GithubService ) {

    private val repoListRateLimit = RateLimiter<String>(10, TimeUnit.MINUTES)

    fun loadRepos(owner: String): LiveData<Resource<List<Repo>>> {
        return object : NetworkBoundResource<List<Repo>, List<Repo>>(appExecutors) {
            override fun saveCallResult(item: List<Repo>) {
                repoDao.insertRepos(item)
            }

            override fun shouldFetch(data: List<Repo>?): Boolean {
                return data == null || data.isEmpty() || repoListRateLimit.shouldFetch(owner)
            }

            override fun loadFromDb() = repoDao.loadRepositories(owner)

            override fun createCall() = githubService.getRepos(owner)

            override fun onFetchFailed() {
                repoListRateLimit.reset(owner)
            }
        }.asLiveData()
    }

    // Details omitted for brevity.
}
于 2019-08-07T04:11:01.040 回答