gpt4 book ai didi

Android:我已经删除了我的数据,但房间里仍然存在一些数据

转载 作者:行者123 更新时间:2023-12-04 10:38:45 25 4
gpt4 key购买 nike

我有 bool 值 booleanCheckAvailabilityData 检查我的 Activity 中的可用性数据以创建添加/删除收藏夹。然后我创建
dataFavoriteMovieById = favoriteMovieViewModel.getAllFavoriteMovieById(idMovie);
通过 id 获取数据。所以我制作条件语句来检查可用性数据,然后将结果放入 bool 值,然后我使用 bool 值来添加或删除收藏夹。

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

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

My First run

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

it contain RoomTrackingLiveData

我该如何解决这个...

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

最佳答案

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

最新的应用程序版本

由于您使用 getAllFavoriteMovieById,您的最新实现不再产生 NPE以更一致的方式。您不再初始化 LiveData FavoriteMovieRepository 中的实例由你自己,但委托(delegate)给 Room为你做。因此,自从 Room 以来,您将不会获得 NPE将始终创建一个列表来返回结果。如果没有项目,它将返回一个空列表。因此,您可以安全地删除 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因为您返回了 favoriteMovieById LiveData 在您的 GetFavoriteMovieByIdAsyncTask 中实际初始化之前.

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

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

FavoriteMovieViewModel.java
FavoriteMovieViewModel反过来,实例将调用委托(delegate)给 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;
}

但那是 错了 , 因为你的 最喜欢的MovieById 设置为 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;
}
}
...

关于Android:我已经删除了我的数据,但房间里仍然存在一些数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60032722/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com