Android: 使用 Room 的存储库函数 returns false

Android: Repository function returns false using Room

我在 recyclerview 项目中添加了一个收藏按钮,并使用 Room 保存收藏的数据。发生的事情是存储库函数 isFavourites returns false 即使数据存在于数据库中。

由于 Room 不应该 运行 在主线程上,我正在使用 Executors 并且在记录时,我意识到 Executors 方法中的布尔变量 returns true 但在外面,它 returns false.

我该如何解决这个问题?

FavouriteDAO.java

@Dao
public interface FavouriteDao {

    @Query("SELECT EXISTS (SELECT 1 FROM favourites WHERE id=:id)")
    public boolean isFavourite(int id); 

}

FavouriteRepository.java

boolean isFavourite(int id) {
            final boolean[] b = new boolean[1];
            Executors.newSingleThreadExecutor().execute(() -> {
                b[0] = favouriteDao.isFavourite(id);
                Log.d(TAG, "Favourite is" + b[0]); <--- returns true if data exists
            });
            Log.d(TAG, "Favourite is" + b[0]); <--- returns false always
            return b[0];
        }

FavouriteViewModel.java

 public boolean isFavourite(int id) {   return mRepository.isFavourite(id); }

这在 Activity 中总是 returns 错误:

  boolean isFavourite = favouriteViewModel.isFavourite(id);

您在异步任务完成之前检查布尔值,因此您始终读取其默认值 false。当 Executor 任务完成时,您需要某种回调:

Java executors: how to be notified, without blocking, when a task completes?

您也可以使用 RXJava,它有 built-in 个解决方案。