#java #android #android-studio #mvvm #dao
#java #Android #android-studio #mvvm #dao
Вопрос:
Я использую модель Room View
я хочу проверить, существует ли идентификатор фильма в БД или нет, чтобы узнать, добавил ли пользователь его в избранное или нет, чтобы изменить цвет кнопки и текст и удалить его из БД, если кнопка нажата снова.
Я не знаю, как реализовать оператор if для его реализации, я много чего перепробовал, но это не работает.
это мой MovieDetailActivity
public class MovieActivity extends AppCompatActivity {
private RecyclerView.LayoutManager rvLayout;
public Context context;
// Constant for default task id to be used when not in favourite
private static final int DEFAULT_TASK_ID = -1;
ToggleButton button;
AppDatabase appDatabase;
Movie movie;
int id;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.movies_details);
appDatabase = AppDatabase.getInstance(getApplicationContext());
Intent intent = getIntent();
movie = intent.getParcelableExtra("get_data");
id = movie.getId();
checkFavorite();
if (id != DEFAULT_TASK_ID) {
AddTaskViewModelFactory factory = new AddTaskViewModelFactory(appDatabase, id);
final AddTaskViewModel viewModel = ViewModelProviders.of(this, factory).get(AddTaskViewModel.class);
viewModel.getTask().observe(this, new Observer<Movie>() {
@Override
public void onChanged(Movie movie) {
viewModel.getTask().removeObserver(this);
button.setTextOn("Added");
button.getResources().getColor(R.color.colorGreen);
}
});
}
button.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
if (b) {
compoundButton.setBackgroundColor(ContextCompat.getColor(compoundButton.getContext(), R.color.colorGreen));
addToFavourite();
} else {
compoundButton.setBackgroundColor(ContextCompat.getColor(compoundButton.getContext(), R.color.colorGrey));
deleteFromFavourite();
}
}
});
}
public void addToFavourite() {
AppExecutors.getInstance().diskIO().execute(() -> {
appDatabase.movieDao().insert(movie);
Log.d("the movie ID added " id, " good");
});
}
public void deleteFromFavourite() {
AppExecutors.getInstance().diskIO().execute(() -> {
appDatabase.movieDao().delete(movie);
Log.d("the movie ID deleted " id, " bad");
});
}
public void checkFavorite() {
AppExecutors.getInstance().diskIO().execute(() -> {
appDatabase.movieDao().getAllMovies(id);
if (appDatabase.movieDao().check(id) != 0) {
button.setTextOn("Added");
button.getResources().getColor(R.color.colorGreen);
}
Log.d("the movie ID deleted " id, " bad");
});
}
}
это мой Dao
@Dao
public interface MovieDao {
@Query("SELECT * FROM Movies_Table WHERE id = :id")
LiveData<Movie> getAllMovies(int id);
@Update()
void update(Movie m);
@Query("SELECT id FROM Movies_Table WHERE id = :id")
int check(int id);
@Insert(onConflict = OnConflictStrategy.REPLACE)
void insert(Movie m);
@Delete()
void delete(Movie m);
@Query("SELECT * FROM Movies_Table ")
LiveData<List<Movie>> getAllMovies();
}
Ответ №1:
Попробуйте изменить метод DAOs check
:
@Query("SELECT count(id) FROM Movies_Table WHERE id = :id")
int check(int id);
и он вернет 0, если фильм с идентификатором не существует, и ненулевой, если он существует в таблице
Комментарии:
1. но если у меня уже есть фильм в моей БД и я проверяю наличие другого, он также вернет ненулевое значение, я прав??