【问题标题】:Android: i'm already delete my data, but in room still exists some dataAndroid:我已经删除了我的数据,但房间里仍然存在一些数据
【发布时间】:2020-02-03 03:22:36
【问题描述】:

我有 Boolean booleanCheckAvailabilityData 来检查我的活动中的可用性数据以创建添加/删除收藏夹。然后我创建

dataFavoriteMovieById = favoriteMovieViewModel.getAllFavoriteMovieById(idMovie);

通过 id 获取数据。所以我做了条件语句来检查可用性数据,然后将结果放入布尔值,然后我使用布尔值来添加或删除收藏夹。

if (dataFavoriteMovieById == null) {
    booleanCheckAvailabilityData = false;
} else {
    booleanCheckAvailabilityData = true;
}

在第一次运行中,它起作用了。我的 dataFavoriteMovieById 为空

但是,在我添加或删除收藏后。它始终包含数据 (RoomTrackingLiveData)。

我该如何解决这个问题...

我的代码链接:https://github.com/komangss/Submission-Menjadi-Android-Developer-Expert/blob/master/app/src/main/java/com/dicoding/submissionmade2_1/activity/DetailMovieActivity.java

【问题讨论】:

    标签: android android-room android-livedata


    【解决方案1】:

    我玩过你的应用(感谢提供 github 链接),这是我的结果。

    最新应用版本

    您的最新实现不再产生 NPE,因为您以更一致的方式使用 getAllFavoriteMovieById。您不再自己在FavoriteMovieRepository 中初始化LiveData 实例,而是将其委托给Room 为您完成。因此,您不会得到 NPE,因为Room 将始终创建一个列表来返回结果。如果没有项目,它将返回一个空列表。因此,您可以在此处安全地删除 try/catch

    try {
        favoriteMovieViewModel.getAllFavoriteMovieById(idMovie).observe(this, new Observer<List<FavoriteMovie>>() {
            @Override
            public void onChanged(List<FavoriteMovie> favoriteMovies) {
                booleanCheckAvailabilityData = favoriteMovies.size() != 0;
            }
        });
    
    } catch (NullPointerException e) {
        Log.d("ini bug nya", e.getMessage());
    }
    

    原始应用版本

    除了@Paul Ost 所说的favoriteMovieViewModel 应该如何正确使用(通过听而不是直接使用),我将解释为什么你实际上有一个NPE

    在那个版本中,您遇到了 NullPointerException,因为您在 GetFavoriteMovieByIdAsyncTask 中实际初始化之前返回了 favoriteMovieById LiveData。

    所以,这里详细介绍了正在发生的事情。首先,一旦你的DetailMovieActivity 被创建,favoriteMovieViewModel 调用getAllFavoriteMovieById() 如下:

    DetailMovieActivity.java

    ...
    favoriteMovieViewModel = ViewModelProviders.of(this).get(FavoriteMovieViewModel.class);
    dataFavoriteMovieById = favoriteMovieViewModel.getAllFavoriteMovieById(idMovie);
    ...
    

    FavoriteMovieViewModel.java

    FavoriteMovieViewModel 实例又将调用委托给FavoriteMovieRepository 实例,如下所示:

    public LiveData<List<FavoriteMovie>> getAllFavoriteMovieById(int idMovie) {
        return repository.getFavoriteMovieById(idMovie);
    }
    

    FavoriteMovieRepository.java

    最后,getFavoriteMovieById 启动了一个GetFavoriteMovieByIdAsyncTask 并返回了favoriteMovieById

    public LiveData<List<FavoriteMovie>> getFavoriteMovieById(int id_movie) {
        new GetFavoriteMovieByIdAsyncTask(favoriteMovieDao).execute(id_movie);
        return favoriteMovieById;
    }
    

    但那是错误,因为您的 favoriteMovieById 默认设置为null,所以在第一次运行时,您总是会得到它。

    您的 AsyncTask 最终设置了一个非空值,但为时已晚:

    ...
    private static class GetFavoriteMovieByIdAsyncTask extends AsyncTask<Integer, Void, Void> {
      ... 
        @Override
        protected Void doInBackground(Integer... integers) {
            FavoriteMovieRepository.favoriteMovieById = favoriteMovieDao.getFavoriteMovieById(integers[0]);
            return null;
        }
    }
    ...
    

    【讨论】:

      【解决方案2】:

      从我在您的代码中可以看到 - getAllFavoriteMovieById 按预期工作。问题是 - 您使用 LiveData 作为 getAllFavoriteMovieById 的返回类型,因此它返回的不是值本身,而是 LiveData 包装器。但是,如果您尝试观察这个 LiveData 对象,您将(大概是因为我没有看到相关代码)收到 null 而不是最喜欢的值。在此观察者中为您的booleanCheckAvailabilityData 赋值的唯一正确位置(当然取决于您的 DAO 代码)。

      favouriteMovieViewModel.getAllFavoriteMovieById().observe(this, Observer { data ->
              if (data == null) {
                  booleanCheckAvailabilityData = false;
              } else {
                  booleanCheckAvailabilityData = true;
              }
      })
      

      类似的东西(再次取决于您的 DAO 代码和getAllFavoriteMovieById 实现) 希望对您有所帮助。

      【讨论】:

      • 我已经尝试过了,不幸的是,它在我的布尔值中导致了 NullPointerException。如果我删除 try catch 它会出错:Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void androidx.lifecycle.LiveData.observe(androidx.lifecycle.LifecycleOwner, androidx.lifecycle.Observer)' on a null object reference
      【解决方案3】:

      ROOM 尝试在插入新数据之前删除旧 TABLE。在这种情况下,旧数据将被删除,因为我们正在删除旧数据

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-01-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多